Как отследить завершение работы в приложении?
Материал из 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