SendMessage(HWND_BROADCAST,....)挂起

时间:2009-12-23 09:35:19

标签: windows winapi

当我使用the SendMessage函数和HWND_BROADCAST时,应用程序挂起。申请人长时间没有回复。

任何人都可以解释原因吗?

4 个答案:

答案 0 :(得分:19)

当进程具有顶级窗口但未在创建窗口的线程上调用GetMessage或PeekMessage时,会发生这种情况。

为了向后兼容Windows 3.0,直到系统中的所有顶级窗口都响应了您的广播,SendMessage才会返回。在Windows多线程之前,这种行为有意义,因为SendMessage(),即使发送到其他进程也永远不会阻塞。

但是从Win32开始,当您将SendMessage发送到另一个进程中的窗口时,实际发生的是您的线程阻塞,直到另一个进程中的线程唤醒并处理该消息。如果那个线程忙,或者只是不抽信息,那么你就等了。

因此,当您使用HWND_BROADCAST时,应始终使用SendNotifyMessageSendMessageTimeout,否则将消息发送到其他进程拥有的Windows。

答案 1 :(得分:3)

这是因为当使用SendMessage调用HWND_BROADCAST时,它首先枚举所有可用的窗口,然后为每个窗口调用SendMessage。在窗口处理完消息之前,SendMessage将不会返回。如果单个窗口需要很长时间来处理消息,则整个呼叫将被延迟。

答案 2 :(得分:0)

SendMessageTimeout会限制应用程序在等待接收方接受时阻塞的时间。

另一种解决方法是启动多个线程并让它们一次传递多个消息(即并行传递)。然后,如果其中一个接收器挂起,则不会终止整个应用程序。

答案 3 :(得分:0)

至少有一个进程有一个消息泵,但没有消息。在所有接收者处理完消息之后,SendMessage才会返回...因此它不会返回。您可以尝试使用SendMessageTimeout来解决此问题。

顺便说一句,这就是为什么启动进程并等待其进程句柄可能会遇到问题。我在我的网站here上对此进行了描述。