2011-07-07 149 views
3

我有一個應用程序隱藏自己關閉的紅十字。用戶可以通過右鍵單擊托盤圖標並選擇退出來退出它。但是,這將顯然是從關停阻止Windows,所以我做了一個程序,一個WM_QUERYENDSESSION響應,使收盤,這是相關代碼:不會阻止窗口關閉OnCloseQuery

procedure TMainForm.OnWindowsEnd(var Msg: TMessage); // responds to message WM_QUERYENDSESSION; 
begin 
    AllowClose:=true; 
    Close; 
end; 

procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin 
    CanClose:=AllowClose; 
    if NOt AllowClose then 
    Hide; 
end; 

但奇怪的事情持續發生。當我發出關機時,此應用程序關閉很好。但就是這樣。當我發出第二次關機時,系統退出正常。 (我在WinXP中測試這個)。

可能是什麼原因?謝謝


ANSWER 代碼應該是這樣的

procedure TMainForm.OnWindowsEnd(var Msg: TMessage); // responds to message WM_ENDSESSION; 
begin 
    // Possible checking for flags, see http://msdn.microsoft.com/en-us/library/aa376889%28v=vs.85%29.aspx 
    AllowClose:=true; 
    Msg.Result:=1; 
end; 

procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin 
    CanClose:=AllowClose; 
    if NOt AllowClose then 
    Hide; 
end; 

回答

8

WM_QUERYENDSESSION是 「查詢」,而不是一個關機命令:Windows詢問你,如果你與關閉OK,沒有按別讓你關機。您不應該致電Close

其次,Windows在處理該消息時希望您返回TRUE,因此它知道您有潛在的關機可能。我假設你沒有將結果設置爲TRUE,所以Windows終止了第一個關閉請求。

+0

啊我忘了提及我試過WM_ENDSESSION和WM_QUERYENDSESSION(根據MSDN,這兩個與關閉Windows有關)。將嘗試。 –

+0

好吧,現在我又發現自己又傻了。我閱讀了關於MSDN關閉的描述,並且在那裏解釋了這一點,但在處理消息時,我無法確定如何「返回TRUE」。你能幫我解決嗎? –

+0

在你的消息處理程序中,執行'msg.Result:= 1'。真的是不是0的東西。 –