我想阻止我的應用程序被關閉由Windows。 該應用程序在Windows 8上運行並使用XE6編寫。 我試過下面的代碼,但它似乎完全被忽略。爲了測試它,我只需通過任務管理器發送「結束任務」給它。 我需要的是一種讓應用程序完成當應用程序被用戶關閉時,由Windows關機的任務管理器完成的方式。 正常關閉不是問題,這是由FormCloseQuery事件處理的。但另外兩種方法我無法工作。直到Windows XP,通過捕獲wm_endsession和wm_queryendsession,從vista開始,您需要使用ShutDownBlockReasonCreate,它會返回true,但似乎無法工作。德爾福防止應用程序關機
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;
更新
更改消息結果爲true,併除去睡眠改變不了什麼。
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)。 – 2014-08-27 20:31:14
你不能說功能是「惡作劇」。檢查'ShutDownBlockReasonCreate'的返回值,如果返回false,則使用'GetLastError'來找出失敗的原因。如果你不打算檢查返回值來找出原因,你就不能說「API不工作」。 – 2014-08-27 20:31:41
該函數返回true,如果我從一個按鈕調用它,我不能檢查WMQueryEndSession中的結果,因爲應用程序關閉之前,我可以檢查它的值。 – GuidoG 2014-08-27 20:45:11