2015-07-13 102 views
0

如果系統試圖關閉,應用可以通過覆蓋OnQueryEndSession()並返回FALSE來阻止此關閉。當然,這意味着WM_ENDSESSION是對停機做出迴應的唯一明確信息。我應該處理WM_ENDSESSION,WM_QUERYENDSESSION,兩者還是兩者都不?

另一方面,this question的最佳答案引用不低於Raymond Chen的話說,迴應WM_ENDSESSION實質上是毫無意義的。所以這是令人困惑的。

是否有某種「最佳實踐」原則可用於決定哪些消息(如果有)應該響應哪些類型的應用程序關閉工作?

特別是,如果沒有處理消息,關閉過程是否會導致應用程序關閉,就好像用戶手動關閉了應用程序(例如,單擊紅色的X關閉按鈕)?來自微軟的

+1

這是一個誤導。 [原文在這裏](http://blogs.msdn.com/b/oldnewthing/archive/2008/04/21/8413175.aspx),它不會*說*迴應'WM_ENDSESSION'是毫無意義的,它他說,Windows在WM_ENDSESSION後發送'WM_CLOSE'是毫無意義的。 (我認爲或許這張海報與關於處理DLL_PROCESS_DETACH的[類似引用](http://blogs.msdn.com/b/oldnewthing/archive/2012/01/05/10253268.aspx)混淆。) –

回答

4

This article對Vista之前和之後的會議結束最佳實踐進行了非常全面的討論。文章清楚地表明,如果有人收到一個WM_QUERYENDSESSION,那麼關機會在某個時候發生。

只要所有應用程序對WM_ENDSESSION消息做出了響應,或者在接收到WM_ENDSESSION消息後5秒內被強制終止,則Windows可能隨時關閉。這可能會限制對WM_ENDSESSION的迴應。

如果應用程序需要更多的時間來清理自己:

如果您的應用程序可能需要超過5秒即可完成響應WM_ENDSESSION其關閉處理,它應在其WM_QUERYENDSESSION處理程序調用ShutdownBlockReasonCreate() ,並立即向WM_QUERYENDSESSION返回TRUE,以免阻塞關閉。然後它應該在其WM_ENDSESSION處理程序中執行所有關閉處理。

Windows將顯然不發送任何其他消息給你的應用程序,以允許其退出「正常」(例如WM_CLOSE)。相反,它只會打電話給TerminateProcess。如果你想要一個優雅的關閉,你必須在上述約束條件下自己構建它。

+2

它是值得注意的是,當你收到'WM_ENDSESSION'時,你必須在從消息處理程序返回之前執行所有必要的關閉處理*。這顯然是[一個常見的錯誤](http://blogs.msdn.com/b/oldnewthing/archive/2013/06/27/10429232.aspx)。 –

相關問題