如何区别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发送带有指针参数的消息

时间: 2024-10-05 05:00:12

如何区别PeekMessage&GetMessage SendMessage&PostMessage的相关文章

Delphi SendMessage PostMessage 原理和区别

今天用实例解释一下SendMessage PostMessage 原理和区别: 向按钮(Button)发送单击: SendMessage: SendMessage(Button1.Handle, WM_LBUTTONDOWN, 0, 0); SendMessage(Button1.Handle, WM_LBUTTONUP, 0, 0); PostMessage: PostMessage(Button1.Handle, WM_LBUTTONDOWN, 0, 0); PostMessage(Butt

WEBBROWSER中模拟鼠标点击(SendMessage/PostMessage)

好久没有写文章,发一篇顶顶博客访问量.别人建议转一些比较好的代码也贴过来,但是我打算这里主要发自己原创的代码,所以么..流量该多少就多少吧... 回到主题,在webbrowser中点击某链接网上几乎都是用document对象模拟点击,这个方法基本能应对一般的情况,但是例如广告联盟的点击XXX就有检测机制(不多解释,你们懂的).所以完全模拟鼠标的点击事件就比较完美.于是我用了最常见的SendMessage. 接下来就要解决一个问题,webbrowser的句柄问题.从控件本身得到的句柄不是真正的浏览

PeekMessage&GetMessage

原文:http://www.cnblogs.com/faceang/archive/2010/05/25/1743757.html PeekMessage与GetMessage的对比相同点:PeekMessage函数与GetMessage函数都用于查看应用程序消息队列,有消息时将队列中 的消息派发出去. 不同点:无论应用程序消息队列是否有消息,PeekMessage函数都立即返回,程序得以继续执行 后面的语句(无消息则执行其它指令,有消息时一般要将消息派发出去,再执行其它 指令).GetMess

猎豹MFC--发送消息SendMessage PostMessage

添加图片控件: 效果如下: 先添加文字说明: 打开头文件 定义变量: 在对话框初始化代码部分 添加如下代码: 当鼠标左键按下去LButtonDown的时候 实现拖动: 设置布尔变量记录,设置捕获 ,设置光标: 当鼠标左键弹起: 如果处于捕获状态: 释放捕获 布尔变量设置为假 定义鼠标坐标 把 鼠标坐标  由语原来窗体客户区转换为屏幕区 由点获取窗口句柄 类型转换 在文本框中显示窗口句柄 效果 如下: 由窗口句柄获取窗口类名: 再由窗口句柄发送WM_GETTEXT 消息获取窗口标题" 效果如下:

PeekMessage、GetMessage的区别

在Windows编程中经常使用这两个函数来处理消息,它们之间的区别就是GetMessage是阻塞的,PeekMessage是非阻塞的. GetMessage原型如下:BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax); PeekMessage原型如下:BOOL PeekMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilter

PreTranslateMessage和TranslateMessage区别

PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当需要在MFC之前处理某些消息时,常常要在这里添加代码. MFC 消息控制流最具特色的地方是CWnd类的虚拟函数PreTranslateMessage(),通过重载这个函数,可以改变MFC的消息控制流程,甚至可 以作一个全新的控制流出来.只有穿过消息队列的消息才受PreTranslateMessage()影响,采用SendMessage()或其他类似的方

Delphi中SendMessage使用说明 good

Delphi中SendMessage使用说明 SendMessage基础知识 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回. 函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam): 参数: hWnd:其窗口程序将接收消息的窗口的句柄.如果此参数为HWND_BRO

PeekMessage究竟做了什么?

1.UI线程 2.工作线程 把Delphi里TThread的WaitFor函数转化成C++代码,就会是下面这个样子. BOOL TThread::WaitFor(HANDLE hThread) { MSG msg; HANDLE handle[1]; handle[0] = hThread; DWORD dwWaitResult = 0; do { // This prevents a potential deadlock if the background thread // does a S

Windows消息队列

一 Windows中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个"消息队列",即应用程序队列,用来存放该程序可能 创建的各种窗口的消息.应用程序中含有一段称作"消息循环"的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中.  二 Windows为当前执行的每个Windows程序维护一个「消息队列」.在发生输入事件之后,Windows将事件转换为一个「消息」并将消息放入程序的消息队列中.程序通过执行一块称之为「消息循