SendMessage(HWND_BROADCAST,...)挂起

问题描述 投票:14回答:4

当我在the中使用HWND_BROADCASTSendMessage函数时,应用程序会挂起。申请长时间没有回复。

有谁能解释为什么?

windows winapi
4个回答
19
投票

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

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

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

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


3
投票

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


0
投票

有一个SendMessageTimeout,它将限制应用程序在等待接收器接受时阻塞的时间。

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.