1、首先是返回值意义的区别,我们先看一下MSDN里的声明:
LRESULT SendMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
BOOL PostMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
其中4个参数的意义是一样的,返回值类型不同(其实从数据上看他们一样是一个32位的数,只是意义不一样),LRESULT表示的是消息被处理后的返回值,BOOL表示的是消息是不是Post成功。
2、PostMessage是异步的,SendMessage是同步的。
PostMessage只把消息放入队列,不管消息是否被处理就返回,消息可能不被处理;而SendMessage等待消息被处理完了之后才返回,如果消息不被处理,发送消息的线程将一直被阻塞。
3、如果在同一个线程内,SendMessage发送消息时,由USER32.DLL模块调用目标窗口的消息处理程序,并将结果返回。SendMessage在同一线程中发送消息并不入线程消息队列。PostMessage发送消息时,消息要先放入线程的消息队列,然后通过消息循环分派到目标窗口(DispatchMessage)。
如果在不同线程内,SendMessage发送消息到目标窗口所属线程的消息队列,然后发送消息的线程在USER32.DLL模块内监视和等待消息处理,直到目标窗口处理完返回。SendMessage在返回前还做了很多工作,比如,响应别的线程向它SendMessage。Post到别的线程时,最好用PostThreadMessage代替PostMessage,PostMessage的hWnd参数可以是NULL,等效于PostThreadMessage+GetCurrentThreadId。PostWM_QUIT时,应使用PostQuitMessage代替。
4、系统只整编(marshal)系统消息(0到WM_USER之间的消息),发送用户消息(WM_USER以上)到别的进程时,需要自己做整编。
用PostMessage、SendNotifyMessage、SendMessageCallback等异步函数发送系统消息时,参数里不可以使用指针,因为发送者并不等待消息的处理就返回,接受者还没处理指针就已经被释放了。
5、在Windows2000/XP里,每个消息队列最多只能存放10,000个Post的消息,超过的还没被处理的将不会被处理,直接丢掉。这个值可以改得更大:[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Windows]USERPostMessageLimit,最小可以是4000。
分享到:
相关推荐
SendMessage与PostMessage区别,区别演示示例
在C#中SendMessage和PostMessage的参数传递 在C#中可以使用Window API提供的SendMessage和PostMessage来传递参数。两者的区别简单介绍下:返回值的不同,我们先看一下 MSDN 里的声明: LRESULT SendMessage( HWND ...
2.两个对话框CMessageDlg和ConeDlg; 3.CMessageDlg为父窗口,ConeDlg为子窗口; 4.父窗口上有一个按钮用于弹出子窗口,子窗口也有一个按钮用来触发事件; 5.子窗口的按钮触发事件后,发送消息给父窗口,然后在...
资源包含两个源程序,里面是借用MFC的消息通信实现简单的两个进程间通信,嗯主要是通过SendMessage或PostMessage,功能实现简单便捷。
主要示例在C#中的SendMessage,PostMessage,包含两个示例,一个资料文档,希望受用。 在C#中 API 消息处理 SendMessage PostMessage 进程通信 发消息 实例 文档资料
主要介绍了VC中SendMessage和PostMessage的区别,较为全面的分析了SendMessage和PostMessage运行原理及用法上的不同之处,非常具有实用价值,需要的朋友可以参考下
资源包含两个源程序,里面是借用MFC的消息通信实现简单的两个进程间通信,嗯主要是通过SendMessage或PostMessage,功能实现简单便捷。该资源是我想搞点分数,分多的大佬麻烦赏赐点,没分的可以找找我另一个同样的...
关于FindWindow PostMessage SendMessage PeekMessage 的两个例子
PostMessage和SendMessage的区别
PostMessage和SendMessage 简单程序
1.保证无毒 2.简单,方便,实用 3.实例可以自行改用 4.如有非法,本人无法律责任,由改动代码人负责! 5.需要更多本人作品,查找标签“朱建强” 6.请下载,杀毒后再使用!
使用postMessage SendMessage 进程间通讯 管道 剪贴板 邮槽 共享内存 在子父进程间用postmessage通讯,本来用管道是最好的
API :GetScrollBarInfo GetScrollInfo SetScrollInfo PostMessage SendMessage 的实例 忙得很没有整理,自用备忘!嫌文件乱就不要下啦,我自己用的,如果要下的,直接看form2里面的api类!
postMessage在使用时,需要传入2个参数,data和originUrl。data是指需要传递的内容,但是部分浏览器只能处理字符串参数,所以我们一般把data序列化一下,即JSON.stringify(),originUrl是指目标url,指定的窗口。 ...
主要介绍了VC自定义消息响应函数postmessage用法示例,并对比说明了postmessage与sendmessage的用法区别,需要的朋友可以参考下
一种将CString对象发送到当前进程中的Windows的可靠机制。
而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。 请问,调用SendMessage后弹出另外一个窗体,如何再接着处理这个弹出的窗体。最好有代码示例,谢谢! 求解第二步.........
http://blog.csdn.net/lindonglian/article/details/43315681
将鼠标事件和键盘事件记录下来 技术亮点: 1钩子技术 2SendMessage和PostMessage的使用 3链表的使用 4鼠标事件和键盘事件 5文件的读写