我读过关于SendMessage()从另一个线程调用的两个相互矛盾的概念:
第一个是将消息发布到消息队列中。
第二个是SendMessage()直接调用。但是,调用线程会阻塞,上下文切换到UI线程,然后窗口过程被调用,当它返回时,调用线程被解除阻塞,上下文切换回它。
那么哪一个是正确的呢?
在我看来,该文档SendMessage相当清楚:
如果指定的窗口是由调用线程创建的,则立即将窗口过程作为子例程调用。如果指定的窗口是由不同的线程创建的,系统将切换到该线程并调用适当的窗口过程。仅当接收线程执行消息检索代码时,才会处理线程之间发送的消息。发送线程被阻塞,直到接收线程处理消息。
发送的消息SendMessage永远不会放入消息队列中。换句话说,你的第一个要点是完全错误的。
在跨线程发送消息的情况下,通常通过调用GetMessage接收者线程的消息循环来在拥有窗口的线程中分派消息。还有其他函数,例如PeekMessage等SendMessage,将调度消息。