Как отследить завершение работы в приложении?
01.01.2007
Нужно отследить момент завершения 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; //Nе разрешаем завершение работы. end;
Взято с Vingrad.ru https://forum.vingrad.ru
Пример отслеживания завершения приложения написанного на чистом 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.
Взято с Vingrad.ru https://forum.vingrad.ru