Я пытаюсь запретить моему приложению закрывать окна. Приложение работает на окнах 8 и написано на XE6. Я пробовал следующий код, но он, кажется, полностью игнорируется. Чтобы проверить это, я просто посылаю ему «конечную задачу» через диспетчер задач. Что мне нужно - это позволить моему приложению завершить то, что он делает, когда приложение закрывается пользователем, диспетчером задач при выключении Windows. Нормальное закрытие не является проблемой, это связано с событием FormCloseQuery. Но другие 2 метода, с которыми я не могу работать. До Windows XP это было легко, поймав wm_endsession и wm_queryendsession, начиная с vista вам нужно использовать ShutDownBlockReasonCreate, который возвращает true, но, похоже, не работает.Delphi предотвращает закрытие приложения
procedure WMQueryEndSession(var Msg : TWMQueryEndSession); message WM_QUERYENDSESSION;
procedure WMEndSession(var Msg: TWMEndSession); message WM_ENDSESSION;
function ShutdownBlockReasonCreate(hWnd: HWND; Reason: LPCWSTR): Bool; stdcall; external user32;
function ShutdownBlockReasonDestroy(hWnd: HWND): Bool; stdcall; external user32;
procedure TForm1.WMEndSession(var Msg: TWMEndSession);
begin
inherited;
Msg.Result := lresult(False);
ShutdownBlockReasonCreate(Handle, 'please wait while muting...');
Sleep(45000); // do your work here
ShutdownBlockReasonDestroy(Handle);
end;
procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
inherited;
Msg.Result := lresult(False);
ShutdownBlockReasonCreate(Handle, 'please wait while muting...');
Sleep(45000); // do your work here
ShutdownBlockReasonDestroy(Handle);
end;
Update
Изменение результата сообщение для истинны и удаления сна ничего не меняет.
procedure TForm1.WMEndSession(var Msg: TWMEndSession);
begin
inherited;
Msg.Result := lresult(True);
ShutdownBlockReasonDestroy(Application.MainForm.Handle);
ShutdownBlockReasonCreate(Application.MainForm.Handle, 'please wait while muting...');
end;
procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
inherited;
Msg.Result := lresult(True);
ShutdownBlockReasonDestroy(Application.MainForm.Handle);
ShutdownBlockReasonCreate(Application.MainForm.Handle, 'please wait while muting...');
end;
См. [Как приостановить выключение окон] (http://stackoverflow.com/a/18347424/576719). –
Вы не можете сказать, что функции являются «обманом». Проверьте возвращаемое значение 'ShutDownBlockReasonCreate', и если он возвращает false, используйте' GetLastError', чтобы узнать, почему это не удалось. Вы не можете сказать, что «API не работает», когда вы не утруждаете себя проверкой возвращаемых значений, чтобы узнать, почему это не так. –
Функция возвращает true, если я вызываю ее с помощью кнопки, я не могу проверить результат в WMQueryEndSession, потому что приложение отключается, прежде чем я могу проверить его значение. – GuidoG