sendmessage与postmessage有什么区别
3个回答
展开全部
看时间过去好久了。楼上都说的很好了,再给你形象的解释下,为后来人解读下把。。
PostMessage 和SendMessage的区别主要在于是否等待其他程序消息处理。
PostMessage只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行;
而SendMessage必须等待其他程序处理消息后才返回,继续执行。
这两个函数的返回值也不同,PostMessage的返回值表示PostMessage函数执行是否正确----BOOL,
而SendMessage的返回值表示其他程序处理消息后的返回值---LRESULT。
PostMessage 是将消息发送到窗口的消息队列中,然后立即返回
SendMessage是将消息发送到窗口函数,在窗口函数处理完消息后才返回。 所以,PostMessage 是异步处理,而SendMessage是同步处理
先来看看Send与Post这两个英文单词的意思:Send有发送的意思,而Post具有投寄的意思。
联想一下现实生活中我们写信(很久很久以前。。。。)来记就很简单了:
Send: 相当于邮寄员,他会将快件亲手交给收件人,并且需要收件人签字,他才闪人。而在消息机制中,就是说,系统(邮寄员)会将收到的消息(邮局分发)直接发送到某个窗口的窗口过程(收件人),并且需要该窗口作出处理(收件人签字)才返回。 这东东就是SendMessage
Post: 相当于邮局、邮筒等等,我们写好信好,会将信交给邮局,或投寄到邮筒里,而什么时候发送,发送到哪里都由邮局来处理,我们投寄信件的时候,是不会等候这封信件到达收件人手里,然后才回家的。 而在消息机制中,就是说,系统(我们)将收到的消息(信件)投寄到应用程序的消息循环(相当于邮筒)中,然后就闪人,具体啥时候处理这条消息(啥时候发送邮件),那就得看“办事效率”了。
区别很明显,SendMessage的消息是不进队列的,而PostMessage的需要排队。
但,值得说明的是:虽然一个要进队,一个不进队,但是最终处理消息的地方都一样:都是系统调用窗口过程进行处理(收件人作出反应)
PostMessage 和SendMessage的区别主要在于是否等待其他程序消息处理。
PostMessage只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行;
而SendMessage必须等待其他程序处理消息后才返回,继续执行。
这两个函数的返回值也不同,PostMessage的返回值表示PostMessage函数执行是否正确----BOOL,
而SendMessage的返回值表示其他程序处理消息后的返回值---LRESULT。
PostMessage 是将消息发送到窗口的消息队列中,然后立即返回
SendMessage是将消息发送到窗口函数,在窗口函数处理完消息后才返回。 所以,PostMessage 是异步处理,而SendMessage是同步处理
先来看看Send与Post这两个英文单词的意思:Send有发送的意思,而Post具有投寄的意思。
联想一下现实生活中我们写信(很久很久以前。。。。)来记就很简单了:
Send: 相当于邮寄员,他会将快件亲手交给收件人,并且需要收件人签字,他才闪人。而在消息机制中,就是说,系统(邮寄员)会将收到的消息(邮局分发)直接发送到某个窗口的窗口过程(收件人),并且需要该窗口作出处理(收件人签字)才返回。 这东东就是SendMessage
Post: 相当于邮局、邮筒等等,我们写好信好,会将信交给邮局,或投寄到邮筒里,而什么时候发送,发送到哪里都由邮局来处理,我们投寄信件的时候,是不会等候这封信件到达收件人手里,然后才回家的。 而在消息机制中,就是说,系统(我们)将收到的消息(信件)投寄到应用程序的消息循环(相当于邮筒)中,然后就闪人,具体啥时候处理这条消息(啥时候发送邮件),那就得看“办事效率”了。
区别很明显,SendMessage的消息是不进队列的,而PostMessage的需要排队。
但,值得说明的是:虽然一个要进队,一个不进队,但是最终处理消息的地方都一样:都是系统调用窗口过程进行处理(收件人作出反应)
展开全部
其实你在网上搜索一下就可以找到很多答案!难道网上的回答都满足不了你,那你指望我们就能让你理解吗?
我把我的理解说一下,希望你懂。
1.SendMessage你就把他理解为调用窗口过程函数即可。
LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
这个好懂吧!把他们等同即可,SendMessage就是 调用WindowProc,SendMessage的返回值就是WindowProc的返回值。
2。PostMessage就比较麻烦。
PostMessage后,系统会把消息放在程序的消息队列。
之后消息循环(这个在win32程序经常看到的)
While(GetMessage(。。。。))
{
。。。。
DispatchMessage(。。。);
}
GetMessage会获取到这个消息。
(对于很多初学者来说这个GetMessage确实不要理解,
因为它跟我们平常的程序代码执行思想很不同。
Getmessage有时会堵塞,程序会停在那里。
它什么时候被调用,谁调用它呢?--其实这都是系统的事,
系统发现程序的消息队列有消息了,就会让你的程序调用
Getmessage,把消息取出来,while循环继续执行,到
DispatchMessage时就可以把它等同于调用窗口过程函数
WindowProc了。
整理一下思路就是:
PostMessage=
消息进入消息队列-》GetMessage把消息取出来-》程序执行到DispatchMessage-》DispatchMessage就相当于调用窗口过程函数了
所以2个函数最后都会去调用窗口过程函数,只是PostMessage调用前要经历一些“曲折”的步骤。
我把我的理解说一下,希望你懂。
1.SendMessage你就把他理解为调用窗口过程函数即可。
LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
这个好懂吧!把他们等同即可,SendMessage就是 调用WindowProc,SendMessage的返回值就是WindowProc的返回值。
2。PostMessage就比较麻烦。
PostMessage后,系统会把消息放在程序的消息队列。
之后消息循环(这个在win32程序经常看到的)
While(GetMessage(。。。。))
{
。。。。
DispatchMessage(。。。);
}
GetMessage会获取到这个消息。
(对于很多初学者来说这个GetMessage确实不要理解,
因为它跟我们平常的程序代码执行思想很不同。
Getmessage有时会堵塞,程序会停在那里。
它什么时候被调用,谁调用它呢?--其实这都是系统的事,
系统发现程序的消息队列有消息了,就会让你的程序调用
Getmessage,把消息取出来,while循环继续执行,到
DispatchMessage时就可以把它等同于调用窗口过程函数
WindowProc了。
整理一下思路就是:
PostMessage=
消息进入消息队列-》GetMessage把消息取出来-》程序执行到DispatchMessage-》DispatchMessage就相当于调用窗口过程函数了
所以2个函数最后都会去调用窗口过程函数,只是PostMessage调用前要经历一些“曲折”的步骤。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-09-24
展开全部
sendmessage这个发送消息,等到消息响应执行完毕才返回,就像调用一个函数一样
postmessage这个发送消息后立即返回,不管消息是否执行
postmessage这个发送消息后立即返回,不管消息是否执行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询