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_LOGOFF
0x80000000
更多信息:http://msdn.microsoft.com/en-us/library/windows/desktop/aa376890(v=vs.85).aspx