对于已销毁的窗口的待处理消息会发生什么情况?

当仍然有消息挂起的时候窗口被破坏会发生什么?

考虑以下情况:

有三个线程,A,B和C.线程C拥有一个窗口。

线程A和B使用SendMessage将消息发送到窗口。 来自A的消息首先到达。 当C处理来自A的消息时,它使用DestroyWindow销毁它的窗口。

线程B的消息会发生什么? 线程B对SendMessage的调用是否返回?

这在内部是如何工作的?

Solutions Collecting From Web of "对于已销毁的窗口的待处理消息会发生什么情况?"

根据MSDN , DestroyWindow “[…],刷新线程消息队列,[…]”。 我不确定这是否意味着处理消息或倾销他们,所以我试了一下。 原来是后者:所有等待发布的消息都从队列中删除,并被忽略。 至于非排队消息:在我的测试中,等待的SendMessage调用返回并将最后一个错误设置为ERROR_INVALID_PARAMETER - 87 (0x57)

原则上,你打算做的事情是不安全的。 线程C无法保证线程B已经发送了消息; 如果在线程B发送消息之前窗口被销毁,并且在此期间窗口句柄恰好被重用,则线程B可能会将消息发送到错误的窗口,这可能是在不同的应用程序中。

最好的做法是确保调用DestroyWindow 之前 ,所有的线程都被告知特定的窗口句柄已经失效。

但是,实际上,处理在错误时间被重新使用的风险是非常低的。 如果提前通知其他线程是不合理的,那么结果就不会出现问题。 我相信kicsit是正确的,断言消息不会最终在线程C的消息队列中等待,虽然文档没有明确承诺这一点,据我所知。