據the WM_QUERYENDSESSION docs,「應用程序應該尊重用戶的意圖,並返回TRUE。」 This link將其歸納爲「[在XP中]應用程序可以返回TRUE以表示它們可以關閉,或者FALSE以表示它們不應該關閉」。WM_QUERYENDSESSION處理程序的返回值不具有預期效果
然而,在我自己的應用程序,它似乎像相反正在發生的事情:
當我返回FALSE,所有正在運行的應用程序就會被終止,並在計算機重新啓動(當我的應用程序獲取
WM_ENDSESSION
消息,wParam
被設置爲1,指示「系統被關閉或重新啓動」(見WM_ENDSESSION docs))。當我返回TRUE,一些正在運行的應用程序就會被終止,但是當它到達我的應用程序,它似乎停止停機處理,並隨後
WM_ENDSESSION
消息有wParam
設置爲0,因爲如果閉塞下來被中止,我的應用程序仍然打開。還要注意,因爲DefWindowProc
「對於[WM_QUERYENDSESSION]」返回TRUE,所以使用它也會以相同的方式阻塞關閉。
如果我完全刪除的WM_QUERYENDSESSION
全部處理,則整個關停業務經歷爲正常,結束我的應用程序和關閉。這可能表明在我的應用程序中出現了嚴重錯誤,因爲我認爲這會導致與使用DefWindowProc
相同的行爲。我已經觀察到這種行爲,即使我將我的處理程序僅削減爲返回語句,或者使用TRUE或FALSE,或者將消息和參數傳遞給DefWindowProc
。
因爲我不想停止關閉,並幾乎只處理它,我就可以登錄,當它發生,我可以刪除它的所有操作,並有事情表現得所需。當然,這並不解釋爲什麼這似乎完全與文檔相矛盾,所以我想知道是否有人有想法。
這一切會倒在Windows XP中,所以爲Vista +後續的變化是不相關的。
碰巧你是一個對話框?從對話框過程返回「TRUE」不同於從窗口過程返回「TRUE」。 –
我提出了一堆抽象,然後馬上忘記了基礎;是的,這是一個對話框,使用'SetWindowLong'設置真正的返回類型使一切恢復正常。 –