2012-09-05 78 views
7

Win32程序通常有一個消息循環迴路調用的GetMessage的PeekMessage,然後調用在DispatchMessage分發消息到相關窗口的窗口proceedure。是否需要在win32程序中調用DispatchMessage?

但是有沒有需要實際做到這一點?我可以直接在消息循環中直接查看MSG對象,並執行那裏所需的操作,而無需致電DispatchMessage?我在談論的情況下,我有一個單一的窗口沒有其他的窗口控件,例如,如果該窗口只用作direct3d顯示窗口,所以消息將始終指向唯一的窗口。

大部分我只是好奇,但也可能導致我的代碼的某些方面更清潔。

回答

12

您可以撥打DispatchMessage將郵件傳送到適當的窗口,傳送到其「窗口過程」。你認爲你只有一個窗口,但它真的是唯一的一個窗口嗎? COM將創建幫助程序窗口,其他子系統也可能創建幫助程序隱藏窗口,誰將把消息發送到共享消息隊列併發送到這些窗口。無需考慮很多關於這些細節的信息,您就可以使用API​​來發布它們。你必須這樣做,因爲這些子系統依賴於消息泵的存在。

Spy++ Windows SDK工具可能會幫助您查看您確實擁有多少個窗口。

如果你真的擁有唯一的窗口,不管你的處理程序是從DispatchMessage內部調用還是直接通過消息泵調用都沒有太大區別。

+0

這很有道理,謝謝! – jcoder

+1

'DispatchMessage'和'CallWindowProc'也可以做類似考慮windows掛鉤的事情。即使只有一個窗口,你也需要使用它們。我相信有些消息不能在DispatchMessage之外正確處理,但我沒有任何例子可以解決我的問題。也許像'WM_PAINT'這樣的東西。 – tenfour

+1

@tenfour,或許更準確地說,某些消息無論如何都會通過WindowProc調用,並且不會作爲單獨的消息存在隊列中。所以,無論如何WindowProc都是必須的。仍然可以通過這兩種方式處理隊列中發佈的內容。我想不出爲什麼要在泵的一邊處理它們。 –

相關問題