我想知道調用SendMessage(哪些塊)和調用PostMessage以及WaitForSingleObject之間有什麼區別。 想法?SendMessage vs PostMessage + WaitForSingleObject
回答
SendMessage()
如果您從COM調用的上下文中調用COM對象所在的STA(通過消息泵調用調用),則可能會被拒絕。 PostMessage()
不限於遵守COM公寓規則。
另外,PostMessage()
將消息放在窗口消息隊列的末尾。 SendMessage()
繞過隊列。您可以在Raymond Chen的博客The Old New Thing上找到關於消息隊列的更長時間的討論。
我的觀點是,SendMessage()
和PostMessage()
之間的區別比眼睛還要多。我真的建議通過雷蒙德的博客,因爲他已經涵蓋了多年來的許多陷阱。
PostMessage
和WaitForSingleObject
允許您執行異步消息傳遞。您可以發送消息,做其他事情,稍後再回來查看答覆。 SendMessage
是同步的,需要您等待。
我想我應該提到我的目標是實現同步。我會做PostMessage,然後立即調用WaitForSingleObject。 –
+1用於突出顯示主要操作差異 - PostMessaging事件並等待它允許調用方繼續處理。如果目標是在線程處理的稍後階段等待,直到在GUI線程中完全處理先前發佈的消息,則這可以是有用的。 –
我一直認爲SendMessage直接調用你的Windows程序,跳過消息隊列;而PostMessage只是將消息添加到隊列中。
這取決於從哪個線程調用SendMessage()。線程調用總是通過泵進行編組,而不是直接發送給winproc。 –
SendMessage是一個單一的API調用,因此不太容易出錯。隨着內置而不是自己滾動。
這並不是說它不太容易出錯。這些功能提供了一個非常不同的語義目的。您選擇使用其中一種應該基於您希望完成的任務,而不僅僅是如何讓此代碼「工作」。 –
「語義學」適用於自然語言。代碼是代碼的作用,而不是代表它的意思。 –
不,用於促進代碼可讀性,自我記錄和遵守API合同的語義。僅僅因爲代碼現在做某件事並不意味着它會一直繼續做同樣的事情。只是因爲實現者知道代碼的作用並不意味着後面的維護者會知道你爲什麼以一種完全不明顯,不直觀的方式做了什麼。 –
- 1. WaitForSingleObject vs Interlocked *
- 2. SendMessage()和PostMessage()正確的用法
- 3. mfc - 帶自定義參數的sendmessage/postmessage
- 4. 如何在VB.NET中接收PostMessage/SendMessage?
- 5. 這是更快:SetEvent的話,SendMessage,PostMessage的
- 6. 發送不帶SendMessage和PostMessage的密鑰
- 7. C++ WINAPI:如何使用SendMessage/PostMessage WM_KEYDOWN lparam
- 8. SendMessage vs SendNotifyMessage user32.dll api
- 9. 爲什麼Control.Invoke()調用PostMessage()而不是SendMessage()?
- 10. C++:使用PostMessage/SendMessage發送鼠標點擊
- 11. WinApi消息循環,Postmessage的工作方式像SendMessage
- 12. 無法通過SendMessage/PostMessage發送組合SHFT + F3:vC++
- 13. 如何獲取ATL DLL中的HWND(用於SendMessage或PostMessage)
- 14. 如何使用PostMessage/SendMessage點擊菜單項User32
- 15. 我的SendMessage/PostMessage部分代碼有什麼問題?
- 16. 使用PostMessage/SendMessage將密鑰發送到C#IE WebBrowser
- 17. 我不明白如何使用SendMessage或PostMessage調用
- 18. 發送鍵盤到c#中的應用程序(sendkeys,postmessage,sendmessage都不工作)
- 19. iframe到父通信:parent.function vs postmessage
- 20. Web Worker onmessage vs postMessage大小寫
- 21. Postmessage字符串?
- 22. 使用sendmessage和WM_SETTEXT時不能觸發textchanged事件,但PostMessage可以
- 23. WaitForSingleObject返回ERROR_INVALID_HANDLE
- 24. WaitForSingleObject問題
- 25. WaitForSingleObject崩潰
- 26. WaitForSingleObject崩潰
- 27. PostMessage的(HWND,WM_SETTEXT,...),而PostMessage的(HWND,WM_QUIT,..)確實
- 28. 如何使用WaitForSingleObject()
- 29. 如何使用WaitForSingleObject
- 30. WaitForSingleObject的的P/Invoke
如果你想同步調用SendMessage。 –