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` 函数的场景非常有限和特殊。在正常情况下,你只需要发送一个常规的窗口消息。