程序縮小到托盤後系統就無法關機(解決方案)

 程序縮小到托盤後系統就無法關機(解決方案)
                       老帥
   程序最小化到托盤後,會出現系統無法關閉的問題,常見於WinXP系統中,這裏提供一個解決方案!

一、解決方案


響應系統關機消息
procedure WMQUERYENDSESSION(var msg:Tmessage);message WM_QUERYENDSESSION;

procedure TFormTray.WMQUERYENDSESSION(var msg: Tmessage);
begin
  msg.Result := 1;
end;


二、原理

MSDN:

   The WM_QUERYENDSESSION message is sent when the user chooses to end the session or when an application calls one of the system shutdown functions. If any application returns zero, the session is not ended. The system stops sending WM_QUERYENDSESSION messages as soon as one application returns zero.

   當結束對話或者一個程序調用系統關閉功能的時候,WM_QUERYENDSESSION消息會被髮送給尚未終止的所有窗口。當程序在處理這個消息的時候,如果返回了false(0),那麼系統將不結束對話或者關機(註銷)。

   Windows在關機的時候會向所有頂層窗口廣播一個消息WM_QUERYENDSESSION,其lParam參數可以區分是關機還是註銷用戶(註銷用戶時lParam是ENDSESSION_LOGOFF)。然後Windows會等到所有的應用程序都對這個消息返回TRUE纔會關機,因此,只要我們的應用程序對這個消息的處理返回FALSE,Windows就不會關機了。而且通過這個例子,大家也應該可以區分系統關機和註銷用戶了。

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{ 
    switch (iMsg)
    {
        case WM_DESTROY :
            PostQuitMessage (0) ;
            return 0 ;
        case WM_QUERYENDSESSION:
            //關機前,做點保護數據的操作
            return 1;//返回1則可以結束程序
        }
        return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
    }
}


關於lParam參數的值:

ENDSESSION_CLOSEAPP
0x00000001


The application is using a file that must be replaced, the system is being serviced, or system resources are exhausted. For more information, see Guidelines for Applications.

ENDSESSION_CRITICAL
0x40000000

The application is forced to shut down.

ENDSESSION_LOGOFF
0x80000000

The user is logging off.

更多信息:http://msdn.microsoft.com/en-us/library/windows/desktop/aa376890(v=vs.85).aspx


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章