WindowsAPI中PostMessage与SendMessage的区别
1、返回值意义的区别,先看一下 MSDN 里的声明:
LRESULT SendMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
BOOL PostMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
其中 4 个参数的意义是一样的,返回值类型不同。PostMessage的返回值(BOOL)表示PostMessage函数执行是否正确,SendMessage的返回值(LRESULT )表示其他程序处理消息后的返回值。
2、PostMessage 是异步的,SendMessage 是同步的。
PostMessage 只把消息放入队列,不管消息是否被处理就返回,消息可能不被处理;而 SendMessage 等待消息被处理完了之后才返回,如果消息不被处理,发送消息的线程将一直被阻塞。
3、 当一个线程向该线程所建立的窗口SendMessage消息时,由 USER32.DLL 模块调用目标窗口的消息处理程序,并将结果返回,它只是调用指定窗口的消息处理过程,并不将消息入队列。当一个线程向另一个线程所建立的窗口 SendMessage时,该消息要追加到接收消息线程的发送消息队列,然后发送消息的线程进入等待状态,接收消息的线程处理完该消息后,由系统唤醒发送 消息的线程,这时发送线程继续进行。PostMessage 发送消息时,消息要先放入线程的消息队列,然后通过消息循环分派到目标窗口(DispatchMessage)。一个线程的消息队列实际上分为四种不同的 消息队列:Post消息队列、Send消息队列、输入消息队列、应答消息队列。PostMessage是将消息追加到Post消息队列,SendMessage是追加到Send消息队列,两个队列处理的优先级并不一样。
//*****
1.返回值
其中 函数4 个参数的意义是一样的,返回值类型不同(其实从数据上看他们一样是一个 32 位的数,只是意义不一样),LRESULT 表示的是消息被处理后的返回值,BOOL 表示的是消息是不是 Post 成功。
1 2 3 4 |
|
1 2 3 4 |
|
2、PostMessage 是异步的,SendMessage 是同步的。
PostMessage 只把消息放到队列,不管消息是不是被处理就返回,消息可能不被处理;
SendMessage等待消息被处理完了才返回,如果消息不被处理,发送消息的线程将一直处于阻塞状态,等待消息的返回。
同一个线程内:
SendMessage 发送消息时,由USER32.DLL模块调用目标窗口的消息处理程序,并将结果返回,SendMessage 在同一个线程里面发送消息不进入线程消息队列;PostMessage 发送的消息要先放到消息队列,然后通过消息循环分派到目标窗口(DispatchMessage)。
不同线程内:
SendMessage 发送消息到目标窗口的消息队列,然后发送消息的线程在USER32.DLL模块内监视和等待消息的处理结果,直到目标窗口的才处理返回,SendMessage在返回之前还需要做许多工作,如响应别的线程向它发送的SendMessage().PostMessge() 到别的线程的时候最好使用PostThreadMessage 代替。PostMessage()的HWND 参数可以为NULL,相当于PostThreadMessage() + GetCrrentThreadId.
3.系统只整理和编号系统消息(0 到 WM_USER 之间的消息),发送用户消息(WM_USER 以上)到别的进程时,需要自己定义。
用 PostMessage、SendNotifyMessage、SendMessageCallback 等异步函数发送系统消息时,参数里不可以使用指针,因为发送者并不等待消息的处理就返回,接受者还没处理指针就已经被释放了。
WindowsAPI中PostMessage与SendMessage的区别相关推荐
- VC++中 PostMessage和SendMessage的区别
1, PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数.而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息 ...
- MFC工作笔记0009---VC++中 PostMessage和SendMessage的区别
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 最近利用vc编写UDP通讯程序,对其中的消息机制进行了整理.vc中的消息处理与.net中不同.Ne ...
- C#中PostMessage和SendMessage的参数传递实例
用 PostMessage.SendNotifyMessage.SendMessageCallback 等异步函数发送系统消息时,参数里不可以使用指针,因为发送者并不等待消息的处理就返回,接受者还没处 ...
- postmessage与sendmessage的区别
PostMessage 只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行 ; 而 SendMessage 必须等待其他程序处理消息后才返回,继续执行. PostMessage 的返回值表示 ...
- WindowsAPI中W和A的区别
当使用windows api时,一般系统都会提供两个相同方法,但是结尾名字不同. 就跟LoadLibraryA和LoadLibraryW这两种方法. 类似下列 原因在于,针对于不同编码,系统提供的ap ...
- Android Hander post与sendMessage的区别
Android Hander post与sendMessage的区别 post Message缓存相关 SDK 29 post 1. post方法其实与sendMassage方法一样,都会调用 sen ...
- python中break和continue的区别
python中break和continue的区别 break 结束for 或者while 循环 后面还没循环到的 不再循环 continue 当满足某种条件时结束当前值的循环 后面没有循环的继续循环 ...
- java中separator_java - File.separator和路径中的斜杠之间的区别
java - File.separator和路径中的斜杠之间的区别 在Java Path-String中使用/和普通的File.separator有什么区别? 与双反斜杠相比,/平台独立似乎不是原因, ...
- PHP中self和static的区别,php中self与static的区别
原文链接,猛击这里. php中self与static的区别 通过一些示例,我们可以很容易看出self和static的区别.假定我们有class Car – 它有两个方法,model和getModel. ...
最新文章
- php浮点数计算比较及取整不准确解决方法
- csv文件简介(转载)
- 中断中是否可以使用信号量?
- javacore分析工具_Javacore 与 WebSphere Commerce 性能问题之争?谁才是赢家
- 高效的企业测试-集成测试(3/6)
- 服务器安装三节点RabbitMQ集群(3)
- Atitit 数据与模板绑定法 目录 1.1. templet - 自定义列模板	1 1.2. 方式三:直接赋值模版字符。事实上,templet 也可以直接是一段 html 内容,如:	1 1.2.
- Android 学习资料收集
- ups计算软件_一篇文章读懂UPS
- Pytorch实现有监督对比学习损失函数
- OPENCV计算机视觉图像处理频域傅里叶 DFT 变换低通滤波逆变换IDFT
- JavaScript的基础语句整理
- python表白女神
- table中同一列中合并相同项
- 通过Windows7升级正版Windows10
- beego使用API自动化文档生成swagger时,routers目录下无法生成commentsRouter_controllers.go文件
- c语言中优先级劣后级,基金优先级与劣后级的区别,看完就能明白
- MarkDown折叠语法
- 博客大巴,自动登录,并发布信息开发小计。
- 软件构造Lab2总结
热门文章
- 四数之和Python解法
- ppt格式刷快捷键_普通人 | 4个我在知乎上都没有见过的PPT实用技巧
- docker 添加端口映射_Docker快速搭建PHP开发环境详细教程
- Sharepoint java sdk_java – 使用JAX-WS将文件保存到Sharepoint服务器
- java xml签名_Java使用DSA密钥对生成XML签名的方法
- maven 加入第三方库_关于maven,你还要翻阅多少资料才能整理出这一份完整文档...
- html5新增的js api,对HTML5新增JS Api的思考
- edxp显示未安装_如何在 Centos 8 / RHEL 8 上安装和配置 VNC 服务器
- 2021年全国大学生电子设计竞赛重新启动通知及进度安排
- html5 绘制图形,HTML5绘制几何图形