2011-07-21 43 views

回答

17

SendMessage()如果您從COM調用的上下文中調用COM對象所在的STA(通過消息泵調用調用),則可能會被拒絕。 PostMessage()不限於遵守COM公寓規則。

另外,PostMessage()將消息放在窗口消息隊列的末尾。 SendMessage()繞過隊列。您可以在Raymond Chen的博客The Old New Thing上找到關於消息隊列的更長時間的討論。

我的觀點是,SendMessage()PostMessage()之間的區別比眼睛還要多。我真的建議通過雷蒙德的博客,因爲他已經涵蓋了多年來的許多陷阱。

4

PostMessageWaitForSingleObject允許您執行異步消息傳遞。您可以發送消息,做其他事情,稍後再回來查看答覆。 SendMessage是同步的,需要您等待。

+0

我想我應該提到我的目標是實現同步。我會做PostMessage,然後立即調用WaitForSingleObject。 –

+0

+1用於突出顯示主要操作差異 - PostMessaging事件並等待它允許調用方繼續處理。如果目標是在線程處理的稍後階段等待,直到在GUI線程中完全處理先前發佈的消息,則這可以是有用的。 –

3

我一直認爲SendMessage直接調用你的Windows程序,跳過消息隊列;而PostMessage只是將消息添加到隊列中。

+3

這取決於從哪個線程調用SendMessage()。線程調用總是通過泵進行編組,而不是直接發送給winproc。 –

2

SendMessage是一個單一的API調用,因此不太容易出錯。隨着內置而不是自己滾動。

+3

這並不是說它不太容易出錯。這些功能提供了一個非常不同的語義目的。您選擇使用其中一種應該基於您希望完成的任務,而不僅僅是如何讓此代碼「工作」。 –

+0

「語義學」適用於自然語言。代碼是代碼的作用,而不是代表它的意思。 –

+1

不,用於促進代碼可讀性,自我記錄和遵守API合同的語義。僅僅因爲代碼現在做某件事並不意味着它會一直繼續做同樣的事情。只是因爲實現者知道代碼的作用並不意味着後面的維護者會知道你爲什麼以一種完全不明顯,不直觀的方式做了什麼。 –

相關問題