Как отследить завершение работы в приложении?

Материал из DRKB


Нужно отследить момент завершения Windows, и, если пользователь собирается выключить компьютер - программа должна вывести диалог запроса. Если пользователь нажимает кнопку YES - разрешаем выключение, если NO - отменяем. С помощью VCL компонентов это делается элементарно:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  // Спрашиваем пользователя, если инициировано завершение работы.
  if MessageDlg('Вы уверены?', mtConfirmation, mbYesNoCancel, 0) = mrYes then
    CanClose := True   // Разрешаем завершение работы.
  else
    CanClose := False; // Не разрешаем завершение работы.
end;


Author: Mazenrat
Source: Vingrad.ru http://forum.vingrad.ru
ID: 04565



Пример отслеживания завершения приложения написанного на чистом API:

program kvd;

uses
  Windows,
  Messages;

var
  hWnd: THandle;
  WndClass: TWndClass;
  Msg: TMsg;

function WindowProc(hWnd: THandle; uMsg, wParam, lParam: Integer): Integer; stdcall;
begin
  Result := 0;
  case uMsg of
    WM_QUERYENDSESSION:
      Result := Integer(False);
    WM_DESTROY:
      PostQuitMessage(0);
  else
    Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
  end;
end;

begin
  FillChar(WndClass, SizeOf(WndClass), 0);
  with WndClass do
  begin
    hInstance      := SysInit.hInstance;
    lpszClassName  := 'dd';
    lpfnWndProc    := @WindowProc;
  end;
  RegisterClass(WndClass);
  hWnd := CreateWindow('dd', '', 0, 0, 0, 0, 0, 0, 0, hInstance, NIL);
  if hWnd = 0 then
    Exit;
  ShowWindow(hWnd, SW_HIDE);
  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end.


Author: Fantasist
Source: Vingrad.ru http://forum.vingrad.ru
ID: 04566