Why isn't there a SendThreadMessage function? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20081223-00/?p=19743
Raymond Chen?2008年12月23日
為什么沒有 SendThreadMessage 函數?
簡要
文章討論了 Windows 中不存在 `SendThreadMessage` 函數的原因,指出通常應發送常規窗口消息而非線程消息,并建議使用窗口消息代替。
?
正文
????????這里有一個有趣的客戶問題:
Windows 有 `PostMessage` 和 `SendMessage`。它還有 `PostThreadMessage`,但沒有 `SendThreadMessage`。為什么沒有 `SendThreadMessage` 函數?我是否被迫用事件來模擬它?
????????這個假想的 `SendThreadMessage` 函數會做什么?回想一下,`SendMessage` 將消息直接傳遞給窗口過程;消息泵從未看到它。這個假想的 `SendThreadMessage` 函數必須將消息直接傳遞給……什么?沒有“線程窗口過程”可以傳遞給它。
????????好的,也許你仍然打算在你的消息泵中處理線程消息,但你希望調用假想的 `SendThreadMessage` 函數的調用者等到你完成消息處理后再繼續。但它怎么知道你完成了?它不能等待 `DispatchMessage` 返回,因為 `DispatchMessage` 不能分發線程消息。(它應該將它們分發到 _哪里_ ?)線程消息的處理完全由消息泵控制。窗口管理器給它一個線程消息,就窗口管理器而言,這就是故事的結尾。
????????你可能會說,當有人下次調用 `GetMessage` 或 `PeekMessage` 時,線程消息的處理就完成了,但沒有保證下次調用消息檢索函數會來自消息泵。處理線程消息可能導致調用 `MessageBox`,作為一個模態函數,它將有自己的消息循環,這將調用 `GetMessage`,導致你的假想 `SendThreadMessage` 函數決定消息處理已經完成,而實際上它仍在進行。
????????你應該怎么做呢?只創建一個窗口并發送給它一個消息。你想要使用 `PostThreadMessage` 函數的場景非常有限和特殊。在正常情況下,你只需要發送一個常規的窗口消息。