Why do messages posted by PostThreadMessage disappear? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20090930-00/?p=16553
Raymond Chen 2008年09月30日
为什么 PostThreadMessage 发布的信息会消失?
在显示用户界面的线程中,唯一一种您能够实际发送的消息是`WM_NULL`,而且这通常只是因为您出于某种原因需要唤醒消息循环。我经常遇到的一个常见问题是,人们使用`PostThreadMessage`向显示用户界面的线程发送消息,然后困惑为什么他们的消息从未被接收。
实际上,消息确实被发送了。它被接收了,但随后就被丢弃了。
这篇文章实际上是之前一篇标题为“模态循环会吞噬线程消息”的文章的重复,但我用一个更有助于搜索引擎优化的标题重新发表了它。既然我已经在这里了,我不妨对现有文章进行一些补充。
在用户界面线程上,存在模态循环的明显地方是那些明确是模态的函数,比如`DialogBox`、`MessageBox`、`TrackPopupMenuEx(TPM_RETURNCMD)`或`DoDragDrop`。但还有一些不那么明显的模态循环,比如当您点击标题栏并按住鼠标按钮时运行的模态循环,或者当COM在等待一个跨线程调用完成时运行的模态循环。
由于您无法控制这些模态循环,当它们调用`DispatchMessage`时,您的线程消息就会被简单地丢弃。
如果您需要与也显示用户界面的线程可靠地通信,那么您应该创建一个隐藏的窗口,并向该窗口发送或发布消息。