如何区别PeekMessage&GetMessage SendMessage&PostMessage
转自http://blog.csdn.net/young0325/article/details/6430664
Peekmessage和Getmessage都是向系统的消息队列中取得消息,不过性质不同。
若第一次向消息队列中取不到消息,则程序的主线程会被OS(操作系统)挂起;等到OS重新调度到该线程时,而且消息队列仍然是空的时,两者的性质不同:
若使用Getmessage(),则程序的主线程会仍被OS挂起。
若是用Peekmessage(),则程序会取得OS控制权,运行一段时间。此函数多用于处理系统的空闲时间。
从原因上而言:GetMessage函数从消息队列中得到消息后并在队列中删除该消息
PeekMessage函数从消息队列中得到消息后并不在队列中删除该消息
从结果上而言:GetMessage等待一个消息(就像_getch)
PeekMessage不是这样(就像_kbhit)。
GetMessage函数每次调用是肯定取回一个消息的,当消息队列为空的时候此进程会被挂起直到消息队列中有消息可取为止。
PeekMessage函数不管消息队列中是否有消息都会立即返回,返回是可以从返回的值里判断是否取到了消息,准确地说此函数是询问了一下消息队列,至于取回消息后是否从消息队列中删除此消息,由参数可以指定。
Windows3.1时很多应用程序的消息队列是由GetMessage函数构成的,而Win32以后大多数的应用程序的消息队列是由PeekMessage函数构成的,vc和bcb好像都是这样的,基于Win32的抢先式多任务处理机制,采用PeekMessage函数构成的消息循环也不会对系统造成什么威胁。
1, PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数。而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息投放函数。而且,PostMessage的返回值表示PostMessage函数执行是否正确;而SendMessage的返回值表示其他程序处理消息后的返回值。这点大家应该都明白。
2, 如果在同一个线程内,PostMessage发送消息时,消息要先放入线程的消息队列,然后通过消息循环Dispatch到目标窗口。SendMessage发送消息时,系统直接调用目标窗口的消息处理程序,并将结果返回。SendMessage在同一线程中发送消息并不入线程消息队列。 如果在不同线程内。最好用PostThreadMessage代替PostMessage,他工作的很好。SendMessage发送消息到目标窗口所属的线程的消息队列,然后发送消息的线程等待(事实上,他应该还在做一些监测工作,比如监视QS_SENDMESSAGE标志),直到目标窗口处理完并且结果返回,发送消息的线程才继续运行。这是SendMessage的一般情况,事实上,处理过程要复杂的多。比如,当发送消息的线程监测到有别的窗口SendMessage一个消息到来时,他直接调用窗口处理过程(重入),并将处理结果返回(这个过程不需要消息循环中GetMessage等的支持)。 3, msdn: If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters can not include pointers. Otherwise, the operation will fail. 如果发送的消息码在WM_USER之下(非自定义消息)且消息参数中带有指针,那么PostMessage,SendNotifyMessage,SendMessageCallback这些异步消息发送函数将会调用失败。 最好不要用PostMessage发送带有指针参数的消息
如何区别PeekMessage&GetMessage SendMessage&PostMessage的更多相关文章
- keybd_event跟SendMessage,PostMessage模拟键盘消息的区别 z
首先你会发现keybd_event函数中是没有窗口句柄作为参数的,好奇的你一定会觉得很奇怪,那是因为,keybd_event是全局模拟按键的,只对前台窗口(即当前的活动窗口)才可以,但是如果模拟的按键 ...
- PeekMessage&GetMessage
原文:http://www.cnblogs.com/faceang/archive/2010/05/25/1743757.html PeekMessage与GetMessage的对比相同点:PeekM ...
- WEBBROWSER中模拟鼠标点击(SendMessage/PostMessage)
好久没有写文章,发一篇顶顶博客访问量.别人建议转一些比较好的代码也贴过来,但是我打算这里主要发自己原创的代码,所以么..流量该多少就多少吧... 回到主题,在webbrowser中点击某链接网上几乎都 ...
- PeekMessage、GetMessage的区别
在Windows编程中经常使用这两个函数来处理消息,它们之间的区别就是GetMessage是阻塞的,PeekMessage是非阻塞的. GetMessage原型如下:BOOL GetMessage(L ...
- 迥异和诡异的SendMessage和PostMessage
1 故障现象 故障现象1:能够收到SendMessage()发出的消息,但收不到PostMessage()发出的消息. 故障现象2:能够收到PostMessage()发出的消息,但收不到S ...
- SendMessage 窗口函数
函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回. MSD ...
- PreTranslateMessage和TranslateMessage区别(转)
PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当需要在MFC之前处理某些消息时,常常要在这里添加代码. ...
- PreTranslateMessage和TranslateMessage区别
PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当需要在MFC之前处理某些消息时,常常要在这里添加代码. ...
- 窗口间传送数据wsprintf,WM_SETTEXT,SendMessage的理解
对wsprintf API函数的理解: int wsprintf ( LPTSTR lpOut, // pointer to buffer for output LPCTSTR lpFmt, // ...
随机推荐
- Python项目实战
编程只有不断练习才能掌握其精髓,多练练网上的习题和项目,才能掌握python的精髓. Python的模块和包是出了名的多,因此你不必自己从底层开始写起,只需要看懂模块和包的使用文档就可以了,因此掌握一 ...
- data structure
转载请注明出处: 我所遇见的世界会更美好 我曾经逢人就说总是遇到这样那样错误无法解决,但是这些问题只要静下心来仔细思考根本没有解决不了的问题. 其实明明,超级超级简单,然而被老师讲的天花乱坠, 栈: ...
- Java位操作全面总结
转载: Java位操作全面总结 在计算机中所有数据都是以二进制的形式储存的.位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快.在实际编程中,如果能巧妙运用位操作,完全可以达到 ...
- CFX客户端调用报错
Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Unmarshalling Error: unex ...
- C#中操作txt,抛出“正由另一进程使用,因此该进程无法访问此文件”
将你的File.Create(fileName); //创建fileName路径的文本改为 1 2 3 using (FileStream fs = File.Create(fileName)){} ...
- js正则标志/g /i /m的用法,以及实例
js正则标志/g /i /m的用法,以及实例 正则的思想都是一样的,但是具体的写法会有所不同,在这里提到的/g,/i,/m在其他的地方也许就不能用了. 一,js正则标志/g,/i,/m说明 1,/ ...
- MVC设计模式(持续更新中)
MVC设计模式--->英文全称为: model(模型) View (视图) Controller(控制) MVC是一种设计思想.这种思想强调实现模型(Model).视图(View)和控制 ...
- 预处器的对比——Sass、LESS.
发挥CSS预处器的作用是一种很有挑战性的事情.CSS预处器有不同的语言,有不同的语法和功能. 不同CSS预处器的蛮量.功能以及他们的好处——Sass.LESS 介绍 CSS预处理器是一种语言,用来编写 ...
- Maven(1)-安装和配置
Maven(1)-安装和配置 一.本机必须安装好Jdk 二 .maven下载 http://maven.apache.org/download.cgi ,下载后把maven-bin解压到自己的目录即可 ...
- HTML中的一些常见的事件句柄
onclick 所有类似按钮的表单元素和标记<a>及<area>都支持该处理程序.当用户点击元素时会触发它.如果onclick处理程序返回false,则浏览器不执行任何与按钮或 ...