如果A线程向B线程创建的窗口发送消息,无论A、B线程是否同处于同一个进程,都采用相同的处理方式。
如果A、B线程处于不同的进程,A线程不可能处理B线程的窗口消息,因为发送线程不是运行在接收进程的地址空间中,因此不能访问相应窗口过程的代码和数据。
如果A、B线程处于相同的进程呢?此时A线程虽然可以访问B线程的窗口过程的,也可以调用某些窗口过程,但这样就不是通过发送消息种方法了。对于B线程的窗口,它只能从B线程的消息队列中获取消息,B线程窗口的处理过程可以在A线程中,但是消息却必须从B的消息队列中获取。我这样理解是否正确?
A线程向B线程创建的窗口发送消息时,处理方式如下:
第一, 发送的消息要追加到B线程的发送消息队列(send-message queue),同时会为B线程设定QS_SENDMESSAGE标志。
第二,B线程将有两种行为:
a) B线程正执行代码,没有等待消息,则发送的消息不会立即被处理,系统不能中断线程来立即处理该消息(这意味着系统强壮,线程之间不会相互影响对方)。
b) B线程正等待消息,此时系统会检查B线程的唤醒标志,如果检查到唤醒标志含有QS_SENDMESSAGE,则会从B线程的发送消息队列中取出第一个消息(可能有多个,可能有多个线程同时向B线程发送了消息),然后唤醒B线程处理该消息,直到处理完所以的消息。然后关闭QS_SENDMESSAGE标志,挂起。
第三 ,A线程发送消息后(使用SendMessage),它有两种行为:
a) 处于挂起状态(即不会立即从SendMessage函数中返回),A线程会等待一个消息出现在它的应答消息队列中。这是由OS来做的,在B线程处理完A线程发送给它的窗口的消息后,该窗口过程的返回值会被OS登记到A线程的消息队列,相应标志位被设置,然后A线程被唤醒,从应答消息队列中取出该返回值,作为SendMessage的返回值返回给A线程。