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