標籤:als none 進入 系統 one 發送 create ali .com
此文已由作者王榮濤授權網易雲社區發布。
歡迎訪問網易雲社區,瞭解更多網易技術產品運營經驗。
首先XP系統和Vista以後的系統,這兩個訊息的處理方式是不同的。
XP系統
系統發送WM_QUERYENDSESSION,如果你返回FALSE,那麼大多數情況下,系統的登出操作會被終止,並且接下來收到的WM_ENDSESSION的wParam參數值為FALSE。按照微軟的應用程式設計指導,這個時候你需要出UI告訴使用者被終止的原因。
應用程式可以暫時不響應這個訊息,比如先不會返回,而是在處理這個訊息的代碼中彈出一個模態對話方塊提示使用者選擇。
預設情況下,你有5秒的時間來處理這個事情。超過5秒後系統出一個對話方塊提示該應用程式無響應。
如果任意頂層視窗在處理WM_QUERYENDSESSION的時候返回了FASLE,那麼登出過程會被取消,之前收到這個訊息的視窗又會收到一條WM_ENDSESSION訊息,並且它的wParam將為FALSE。
只有當所有頂層視窗收到WM_QUERYENDSESSION之後都返回TRUE,它們才會被一次發送WM_ENDSESSION並且wParam訊息為TRUE。一旦進入這一步,登出過程無法撤銷。
處理WM_ENDSESSION的時間也是5秒,超過後系統也會彈窗提示。一旦應用程式響應了WM_ENDSESSION訊息,Windows會關閉它。接下來,Windows會繼續逐個向剩下的應用程式發送WM_ENDSESSION。
Vista以後的系統
相對於XP系統,Vista系統在以下一些方面進行了修改:
-
未響應應用程式提示的UI方面的改進
-
允許強制關閉
-
無法悄悄撤銷登出過程(WM_QUERYENDSESSION返回FALSE)
-
提供阻止關機的API,不使用這些API而僅僅對WM_QUERYENDSESSION返回FALSE是不行的
-
某些類型的應用程式(比如控制台程式和無可見頂層視窗的程式)將不再被允許阻止關機操作;5秒內對任何訊息無響應的程式在關機過程中會被終止
-
預設逾時值修改(主要是減少)
Vista以後系統處理關機的最佳做法
-
盡量不要阻止關機,這樣給使用者的體驗是最好的
-
那些必須要阻止關機的應用必須使用新的API:
-
在系統關機前提前知道需要阻止關機的應用需要在關鍵代碼之前調用ShutdownBlockReasonCreate(),在這塊代碼後調用ShutdownBlockReasonDestroy();如果在收到WM_QUERYENDSESSION時操作尚未完成,那麼返回FALSE
-
在收到WM_QUERYENDSESSION的時候才知道自己是否要阻止關機的應用程式需要在該訊息的處理函數裡面調用ShutdownBlockReasonCreate()並返回FALSE,然後在關鍵工作完成之後調用ShutdownBlockReasonDestroy()
-
沒有可見頂層視窗的應用程式需要使用超過30秒的時間來處理WM_ENDSESSION時需要在收到WM_QUERYENDSESSION的時候調用ShutdownBlockReasonCreate()然後返回TRUE。
網易雲免費體驗館,0成本體驗20+款雲產品!
更多網易技術、產品、運營經驗分享請點擊。
相關文章:
【推薦】 【RabbitMQ學習記錄】-訊息佇列儲存機制源碼分析
【推薦】 Puppeteer入門初探
WM_QUERYENDSESSION與WM_ENDSESSION