博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对SendMessage与PostMessage的理解
阅读量:4110 次
发布时间:2019-05-25

本文共 1208 字,大约阅读时间需要 4 分钟。

学习VC++近几个月的时间了。

     现在回过头来回想消息机制时,对SendMessage与PostMessage的区别与联系仍然是懵懵懂懂的。有些时候分不清到底是哪个发送消息后会立即返回。

     因此,特别在这些记录一下,以备不时不需:

     1、消息结构体:

1
typedef 
struct
 tagMsg
2
{

3  HWND hWnd;
4  UINT msg;
5  WPARAM wParam;
6  LPARAM lParam;
7  DWORD time;
8  POINT pt;
9}
MSG;
      具体的意思就不记了,反正字面意思也很简单。

    2、SendMessage与PostMessage的区别:

      先来看看Send与Post这两个英文单词的意思:Send有发送的意思,而Post具有投寄的意思。

      联想一下现实生活中我们写信(很久很久以前。。。。)来记就很简单了:

      Send:  相当于邮寄员,他会将快件亲手交给收件人,并且需要收件人签字,他才闪人。而在消息机制中,就是说,系统(邮寄员)会将收到的消息(邮局分发)直接发送到某个窗口的窗口过程(收件人),并且需要该窗口作出处理(收件人签字)才返回。 这东东就是SendMessage

      Post:  相当于邮局、邮筒等等,我们写好信好,会将信交给邮局,或投寄到邮筒里,而什么时候发送,发送到哪里都由邮局来处理,我们投寄信件的时候,是不会等候这封信件到达收件人手里,然后才回家的。 而在消息机制中,就是说,系统(我们)将收到的消息(信件)投寄到应用程序的消息循环(相当于邮筒)中,然后就闪人,具体啥时候处理这条消息(啥时候发送邮件),那就得看“办事效率”了。

      区别很明显,SendMessage的消息是不进队列的,而PostMessage的需要排队。 

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

      

     类似的,还有一对函数 PeekMessage和GetMessage~~~~

    3、PreTranslateMessage

     我们可以PreTranslateMessage来对消息预处理,该用的用,不该用的不用。那么,是否Send和Post来的消息我们都可以用它来预处理呢?

     答案当然是否定的:如果你在深圳,要写封信寄到东北去,那么投寄方式有两种:1、自己带着信跑到东北去,2、将信放到邮局,由邮局分发。

     第1 种情况下,就是SendMessage了,这个时候,还有谁能预处理你的信呢?

     第2种情况下,就是PostMessage了,这个时候,嘿嘿,万一运气不好,被邮局给用PreTranslateMessage给截了.....

     所以说,用SendMessage发送的消息是不能用PreTranslateMessage来预处理的。而Post的就可以,因为它要经过“第三者”嘛。



--- 就记到这里,老板喊我做事了。

你可能感兴趣的文章
pg_stat_statements windows 安装
查看>>
启用mqtt插件
查看>>
行转列
查看>>
erlang,rabbitMQ,mqtt安装配置 1
查看>>
rabbitmq 创建用户和权限
查看>>
数据库权限2
查看>>
linux 部署jar的常用命令
查看>>
安装数据源的驱动程序-postgresql
查看>>
powerDesigner 从postgresql数据库中绘制ER图
查看>>
希腊字母,数学经常用到变量发音
查看>>
CComboBoxEx 插入,删除等
查看>>
RenderMonkdey安装下载与使用——1
查看>>
创建自己的着色器程序
查看>>
osg的灯光使用
查看>>
在osg场景中使用GLSL语言——一个例子
查看>>
VC bug修改 MFC apps must not #include <windows.h>
查看>>
BCG安装与使用
查看>>
用C++语言,调用标准C语言编译器编程的库
查看>>
C++注意事项——1、确保每个对象在使用前已被初始化
查看>>
局部变量和全局变量的差别
查看>>