VC++ SendMessage和PostMessage使用总结

简介: VC++ SendMessage和PostMessage使用总结

结论:

1、 PostMessage不能频繁的发送同一个消息,除非保证上次Post过的消息处理完成。

2、 如果用SendMessage导致应用程序用户体验下降,应该检查消息处理函数,而不仅仅简单改为PostMessage。

3、 如果消息是程序必须处理的,则不能使用PostMessage。消息队列满时,后面来的PostMessage的消息将被丢弃。

4、 如果消息是程序必须处理,而又有可能导致程序卡死,则使用SendMessageTimeout。

5、 如果消息是无关紧要的,则可以建议使用PostMessage。

6、 对于WM_HOTKEY 等Windows特定的消息,则只能使用PostMessage(未在本文中说明)。


1, PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数。而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息投放函数。

2, 如果在同一个线程内,PostMessage发送消息时,消息要先放入线程的消息队列,然后通过消息循环Dispatch到目标窗口。SendMessage发送消息时,系统直接调用目标窗口的消息处理程序,并将结果返回,SendMessage在同一线程中发送消息并不入线程消息队列。

SendMessage要区分环境,如果是对本线程的窗口SendMessage,则不经过任何消息循环,也不放入消息队列,直接调用WindowProc,所以GetMessage和PreTranslateMessage都捕获不到;如果SendMessage是向其它线程或其它进程的窗口发消息,则消息进入消息队列,GetMessage和PreTranslateMessage能捕获到这个消息。

3,PostMessage的返回值表示PostMessage函数执行是否正确;而SendMessage的返回值表示其他程序处理消息后的返回值。这点大家应该都明白。

4,如果在不同线程内。最好用PostThreadMessage代替PostMessage,他工作的很好,SendMessage发送消息到目标窗口所属的线程的消息队列,然后发送消息的线程等待(事实上,他应该还在做一些监测工作,比如监视QS_SENDMESSAGE标志),直到目标窗口处理完并且结果返回,发送消息的线程才继续运行。

区别很明显,SendMessage的消息是不进队列的,而PostMessage的需要排队。值得说明的是:虽然一个要进队,一个不进队,但是最终处理消息的地方都一样:都是系统调用窗口过程进行处理(收件人作出反应)。


PostThreadMessage用于线程间传递消息,可以发给工作线程,也可以发给UI线程。发给工作线程时,该工作线程必须要有自己的消息处理函数。

PostMessage用于发给UI线程,需要指定窗口句柄。

windows消息处理机制是这种:
首先系统(也就是windows)把来自硬件(鼠标,键盘等消息)和来自应用程序的消息 放到一个系统消息队列中去. 而应用程序须要有自己的消息队列,也就是线程消息队列,每个线程有自己的消息队列,对于多线程的应用程序就有和线程数目相等的线程消息队列.
windows消息队列把得到的消息发送到线程消息队列,线程消息队列每次取出一条消息发送到指定窗体,不断循环直到程序退出.这个循环就是靠消息环(while(GetMessage()) TranslateMessage();DispatchMessage();实现的.GetMessage()仅仅是从线程消息中取出一条消息,TranslateMessage()把virtue key消息转化成character消息,如VK_F1会转化成WM_HELP,而DispatchMessage 则把取出的消息发送到目的窗体.假设收到WM_CLOSE消息则结束循环,发送postqiutmessage(0),处理WM_DESTROY销毁窗体!

while (GetMessage(&msg, NULL, 0, 0)) //C++ code
{

    TranslateMessage(&msg);
    DispatchMessage(&msg);

}

相关文章
|
消息中间件 安全 API
C#实现操作Windows窗口句柄:SendMessage/PostMessage发送系统消息、事件和数据【窗口句柄总结之二】
SendMessage/PostMessage API 可以实现发送系统消息,这些消息可以定义为常见的鼠标或键盘事件、数据的发送等各种系统操作......
3770 1
C#实现操作Windows窗口句柄:SendMessage/PostMessage发送系统消息、事件和数据【窗口句柄总结之二】
|
消息中间件 存储 项目管理
handler+message【消息机制】
handler+message【消息机制】
136 0
handler+message【消息机制】
|
API C#
C#使用SendMessage发送组合键
有时需要出发菜单功能,例如发送ALT + F打开应用程序的文件菜单,如何使用SendMessage实现呢? 使用用spy++截取的ALT+F的消息内容(如何使用spy++,请熟悉的高手指点下,我使用spy++ lite没有得到): 000310DC P WM_SYSKEYDOWN nVirtKey:...
1066 0
|
C# JavaScript 前端开发