×

sendmessage与postmessage

sendmessage与postmessage(PostMessage和SendMessage有什么区别)

admin admin 发表于2024-07-13 12:37:56 浏览14 评论0

抢沙发发表评论

大家好,关于sendmessage与postmessage很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于PostMessage和SendMessage有什么区别的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

本文目录

PostMessage和SendMessage有什么区别

其实你在网上搜索一下就可以找到很多答案!难道网上的回答都满足不了你,那你指望我们就能让你理解吗?我把我的理解说一下,希望你懂。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调用前要经历一些“曲折”的步骤。

SendMessage和PostMessage 的区别 PreTranslateMessage

说说区别 PostMessage只负责将消息放到消息队列中,不确定何时及是否处理SendMessage要等到受到消息处理的返回码(DWord类型)后才继续PostMessage执行后马上返回SendMessage必须等到消息被处理后才会返回。

sendmessage与postmessage有什么区别

看时间过去好久了。楼上都说的很好了,再给你形象的解释下,为后来人解读下把。。 PostMessage 和SendMessage的区别主要在于是否等待其他程序消息处理。PostMessage只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行;而SendMessage必须等待其他程序处理消息后才返回,继续执行。这两个函数的返回值也不同,PostMessage的返回值表示PostMessage函数执行是否正确----BOOL,而SendMessage的返回值表示其他程序处理消息后的返回值---LRESULT。 PostMessage 是将消息发送到窗口的消息队列中,然后立即返回 SendMessage是将消息发送到窗口函数,在窗口函数处理完消息后才返回。 所以,PostMessage 是异步处理,而SendMessage是同步处理 先来看看Send与Post这两个英文单词的意思:Send有发送的意思,而Post具有投寄的意思。联想一下现实生活中我们写信(很久很久以前。。。。)来记就很简单了:Send: 相当于邮寄员,他会将快件亲手交给收件人,并且需要收件人签字,他才闪人。而在消息机制中,就是说,系统(邮寄员)会将收到的消息(邮局分发)直接发送到某个窗口的窗口过程(收件人),并且需要该窗口作出处理(收件人签字)才返回。 这东东就是SendMessagePost: 相当于邮局、邮筒等等,我们写好信好,会将信交给邮局,或投寄到邮筒里,而什么时候发送,发送到哪里都由邮局来处理,我们投寄信件的时候,是不会等候这封信件到达收件人手里,然后才回家的。 而在消息机制中,就是说,系统(我们)将收到的消息(信件)投寄到应用程序的消息循环(相当于邮筒)中,然后就闪人,具体啥时候处理这条消息(啥时候发送邮件),那就得看“办事效率”了。区别很明显,SendMessage的消息是不进队列的,而PostMessage的需要排队。 但,值得说明的是:虽然一个要进队,一个不进队,但是最终处理消息的地方都一样:都是系统调用窗口过程进行处理(收件人作出反应)

VC中SendMessage和PostMessage的区别

1、PostMessage会将消息压入窗口所在线程的消息队列,然后返回;而SendMessage则不经过消息队列,SendMessage可认为是直接调用了该窗口的窗口过程,因此在我们需要获得消息处理后的返回值的时候,就要用到SendMessage。例如:当在程序中指定如下使用:PostMessage(hWnd, WM_MSG,0,0),那么当程序执行到PostMessage的时候,仅将消息WM_MSG压入到创建hWnd所指窗口的那个线程的消息队列,然后程序将继续执行下去,而至于程序什么时候响应该消息,则要看那个线程什么时候得到控制权;而指定如下使用:SendMessage(hWnd, WM_MSG,0,0),那么当程序执行到该处时,将发生一次跳转:从当前位置,跳转到hWnd的窗口过程中去响应WM_MSG消息,当消息处理结束,窗口过程返回,程序又将从SendMessage后面继续执行,当然,我们可以获得窗口过程对该消息的处理结果,也即取SendMessage的返回值。(这里只是针对单线程)。2、在多线程应用中,PostMessage的用法还是一样,但SendMessage则不同了。如果在线程A中向线程B所创建的一个窗口hWndB发送消息SendMessage(hWndB,WM_MSG,0,0),那么系统将会立即将执行权从线程A切换到线程B,然后在线程B中调用hWndB的窗口过程来处理消息,并且在处理完该消息后,执行权仍然在B手中!这个时候,线程A则暂停在SendMessage处,等待下次线程A获得执行权后才继续执行,并且仍然可以获得消息处理的结果(返回值)。一般,为了避免死锁,在B中对WM_MSG做出处理之前,要加上: if(InSendMessage())RelpyMessage(lResult);即判断:如果该消息是发自另外一个线程,则立即 RelpyMessage,回复消息,参数lResult即是返回值。而如果是在同一个线程内,则InSendMessage()将会返回FALSE。

关于sendmessage与postmessage和PostMessage和SendMessage有什么区别的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。