如何SendMessage()到在另一个线程上创建的窗口

How do I SendMessage() to a window created on another thread?

本文关键字:线程 创建 窗口 另一个 SendMessage 如何      更新时间:2023-10-16

我有一种情况,我想要SendMessage到一个窗口,该窗口是在另一个线程上创建的,而不是调用SendMessage的线程。

默认行为似乎是永远阻塞而不工作。

因此我将调用更改为PostMessage,这不会阻塞发送线程,但消息似乎从未到达预期的窗口。

那么我如何SendMessage到一个单独的线程上创建的窗口,还是这是不可能的?

PostThreadMessage函数向指定线程的消息队列发送消息。您可以指定要将消息发布到的线程的标识符。这是你想要的吗?

拥有目标窗口的线程在做什么?它需要发送消息,以便能够接收发送或发布给它的消息。这通常是通过GetMessage/TranslateMessage/DispatchMessage循环来完成的。如果线程正在做其他事情-例如阻塞等待事件或互斥锁或IO完成,或者在其他循环中忙于执行计算,则不会接收消息:发送到线程的SendMessage将阻塞,并且PostMessage将发送但不会被传递。

如果目标线程需要管理事件或类似的事情,并且它也拥有一个窗口,您可能需要在该线程的消息循环中使用MsgWaitForMultipleObjects

您正在进入死锁。例如,如果你将SendMessage发送给另一个线程,那么该线程中的windowProc将SendMessage返回给你的窗口,它们将永远锁等待对方。

您需要修复PostMessage(它确实传递消息,只是在您的代码中的某个地方有错误),或者非常小心谁调用谁以及何时。

为了防止线程繁忙或挂起,有SendMessageTimeout .

您创建的每个控件都属于创建它的线程,这意味着该控件的WndProc将在创建该控件的线程中运行。您可以使用SendMessage和PostMessage自由地向任何控件发送消息

CWnd::PostMessage和CWnd::SendMessage的问题是相同的。消息被推送出去,没有被任何东西接收。SendMessage被设计为阻塞;它的工作是阻塞线程,直到消息被接收。

MSDN表示SendMessage:

" SendMessage函数调用指定的窗口过程窗体,并且在窗体过程被处理之前不会返回该消息。"

可以使用CWnd::PostThreadMessage或winapi PostMessage向另一个线程上的窗口发送消息。当你创建窗口时,你可以使用GetSafeHwnd()来获取句柄,也可以在创建线程时使用线程ID。