SendMessage | PostMessage | |
过程类型 | 同步过程:等待其他程序处理消息完了之后才返回,继续执行 | 异步过程:只把消息放入队列,不管其他程序是否处理都返回,然后继续执行 |
返回值 | 表示其他程序处理消息后的返回值 | 表示PostMessage函数执行是否正确 |
同一线程中时 | 系统直接调用目标窗口的消息处理程序,并将结果返回(比较主动);发送消息并不入线程消息队列 | 消息要先放入线程的消息队列,然后通过消息循环Dispatch到目标窗口 |
不同线程内 |
发送消息到目标窗口所属的线程的消息队列,然后发送消息的线程等待(事实上,他应该还在做一些监测工作, 比如监视QS_SENDMESSAGE标志),直到目标窗口处理完并且结果返回,发送消息的线程才继续运行(这是一般情况) |
最好用PostThreadMessage(该函数可以指明放到哪个线程里)代替PostMessage(默认在当前线程) |
参考链接:PostMessage(异步)和SendMessage(同步)的区别
GetMessage | PeekMessage | |
过程类型 | 同步过程:只有在消息队列中有消息时返回,队列中无消息就会一直等,直至下
一个消息出现时才返回。在等的这段时间,应用程序不能执行任何指令 |
异步过程:无论应用程序消息队列是否有消息,PeekMessage函数都立即返回,程序得以继续执行 后面的语句(无消息则执行其它指令,有消息时一般要将消息派发出去,再执行其它指令)。 |
删除消息 | 获得消息后回把消息从消息队列中删去 | 可以设置是否将消息删除 |
在Windows的内部,GetMessage和PeekMessage执行着相同的代码(查看应用程序消息队列,有消息时将队列中的消息派发出去)。而两者最大的不同之处则体现在没有任何消息返回到应用程序的情况下。在此种情况下,PeekMessage会返回一个空值到应用程序,GetMessage会在此时让应用程序休眠。
总结:
GET就是不GET到不罢休
PEEK只是看看有没有消息,有就拿,没有就走人
SEND是要一直等到对方收到了才放心
POST只是把消息放在邮筒里就不管走人了