对SendMessage与PostMessage的理解
学习VC++近几个月的时间了。
现在回过头来回想消息机制时,对SendMessage与PostMessage的区别与联系仍然是懵懵懂懂的。有些时候分不清到底是哪个发送消息后会立即返回。
因此,特别在这些记录一下,以备不时不需:
1、消息结构体:
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的就可以,因为它要经过“第三者”嘛。
--- 就记到这里,老板喊我做事了。
--------------
现在回过头来回想消息机制时,对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

3

4

5

6

7

8

9

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的就可以,因为它要经过“第三者”嘛。
--- 就记到这里,老板喊我做事了。
--------------
<h3>
心静似高山流水不动,心清若巫峰雾气不沾。
</h3>
心静似高山流水不动,心清若巫峰雾气不沾。
</h3>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
2008-09-28 75逻辑题及其答案