当我在the
中使用HWND_BROADCAST
SendMessage函数时,应用程序会挂起。申请长时间没有回复。
有谁能解释为什么?
当有一个进程具有顶级窗口但未在创建该窗口的线程上调用GetMessage或PeekMessage时,就会发生这种情况。
为了向后兼容Windows 3.0,直到系统中的所有顶级窗口都响应了您的广播,SendMessage才会返回。在Windows多线程之前,这种行为有意义,因为SendMessage(),即使发送到其他进程也永远不会阻塞。
但是从Win32开始,当您将SendMessage发送到另一个进程中的窗口时,实际发生的是您的线程阻塞,直到另一个进程中的线程唤醒并处理该消息。如果那个线程忙,或者只是不抽信息,那么你就等了。
因此,在使用HWND_BROADCAST时,应始终使用SendNotifyMessage
或SendMessageTimeout
,否则将消息发送到其他进程拥有的窗口。
这是因为当使用SendMessage
调用HWND_BROADCAST
时,它首先枚举所有可用的窗口,然后为每个窗口调用SendMessage
。在窗口处理完消息之前,SendMessage
不会返回。如果单个窗口需要很长时间来处理消息,则整个呼叫将被延迟。
有一个SendMessageTimeout,它将限制应用程序在等待接收器接受时阻塞的时间。
另一种解决方法是启动多个线程并让它们一次传递多个消息(即并行传递)。然后,如果其中一个接收器挂起,则不会终止整个应用程序。
至少有一个进程有消息泵,但没有消息。在所有接收者处理完消息之后,SendMessage才会返回...因此它不会返回。您可以尝试使用SendMessageTimeout来解决此问题。
顺便说一句,这就是为什么启动进程并等待其进程句柄可能会遇到问题。我在我的网站here上描述了这个。