来自另一个线程的 SendMessage() 调用是否将消息发布到消息队列

Does a SendMessage() call from another thread posts a message to the message queue?

本文关键字:消息 是否 队列 调用 另一个 线程 SendMessage      更新时间:2023-10-16

我读过两个关于从另一个线程调用SendMessage()的矛盾概念:

  • 首先是消息将发布到消息队列。

  • 二是直接调用SendMessage()。但是,调用线程将阻塞,上下文切换到 UI 线程,然后调用窗口过程,当它返回时,调用线程被取消阻止,上下文切换回它。

那么哪一个是正确的呢?

在我看来,SendMessage的文档相当清晰:

如果指定的窗口是由调用线程创建的,则窗口过程将立即作为子例程调用。如果指定的窗口是由其他线程创建的,则系统会切换到该线程并调用相应的窗口过程。仅当接收线程执行消息检索代码时,才会处理线程之间发送的消息。发送线程将被阻止,直到接收线程处理消息。

使用 SendMessage 发送的消息永远不会放在消息队列中。换句话说,你的第一个要点是完全错误的。

在跨线程发送消息的情况下,该消息将在拥有窗口的线程中调度,通常是通过调用收件人线程的消息循环中的GetMessage。还有其他功能,例如 PeekMessageSendMessage等,这将调度消息。

相关文章: