2012-06-01 31 views
1

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 +後續的變化是不相關的。

+3

碰巧你是一個對話框?從對話框過程返回「TRUE」不同於從窗口過程返回「TRUE」。 –

+0

我提出了一堆抽象,然後馬上忘記了基礎;是的,這是一個對話框,使用'SetWindowLong'設置真正的返回類型使一切恢復正常。 –

回答

3

貌似我忘了有關這個鍵位:我是用對話框模板我的窗戶,所以他們被用的對話框所有飾物處理。正如在DialogProc docs看出,「如果對話框過程處理,需要一個特定的返回值的消息,對話框過程應該調用SetWindowLonghwndDlgDWL_MSGRESULTLRESULT)在緊接之前設定所需的返回值返回TRUE「。

我的問題的來源可能與地解釋說:「如果對話框過程返回FALSE,對話管理響應消息,執行默認對話框操作」,即返回FALSE導致默認行爲,這是返回TRUE並且不阻止關機。

還需要注意的是:「雖然對話框過程類似於窗口過程,但它不得調用DefWindowProc函數來處理不需要的消息。不需要的消息由對話框窗口過程在內部處理。所以我幾乎全都錯了。