c++中消息函数(3)----PeekMessage和WaitMessage函数

原创 2012年03月25日 10:56:12

 

l      PeekMessage

此函数检查一个线程消息队列中消息,如果消息存在,放置消息到指定的MSG结构体中。

BOOL PeekMessage(

  LPMSGlpMsg,

  HWND hWnd,

  UINT wMsgFilterMin,

  UINT wMsgFilterMax,

  UINT wRemoveMsg

);

lpMsg    

指向从线程的消息队列接收消息的MSG结构体。

hWnd

       需要检索消息的窗体句柄。

wMsgFilterMin

       指定被检索的最小消息值的整数。

wMsgFilterMax

       指定被检索的最大消息值的整数。

wRemoveMsg

指定消息如何处理。参数如下:

解释

PM_NOREMOVE

PeekMessage处理之后消息不需要从消息队列中移除

PM_REMOVE

PeekMessage处理之后消息需要从消息队列中移除。一个特别即是WM_PAINT消息,它不能从消息队列中移除。

 

返回值

如果有一个消息适合,函数返回非0.

如果没有消息适合,函数返回0.

说明

GetMessage不同的是,PeekMessage函数不会等到有消息放入队列时才返回。

PeekMessage函数检索由hWnd参数标识的和窗体关联的,或者由IsChild函数指定的它们的子窗体,并且在wMsgFilterMin和wMsgFilterMax参数指定的消息范围之间消息。如果hWndNULL,则PeekMessage获取属于调用该函数应用程序的任一窗口的消息(PeekMessage不会获取属于其他线程的窗口消息),如果hWnd=-1,那么函数只返回把hWnd参数为NULLPostTreadMessage函数送去的消息。如果wMsgFilterMinwMsgFilterMax都是0,则PeekMessage就返回所有可得到的消息。

WM_KEYFIRSTWM_KEYLAST常量作为过滤器去获取所有键盘消息;用WM_MOUSEFIRSTWM_MOUSELAST常量作为过滤器区域获取所有的鼠标消息。

函数获取之后将删除消息队列中的除WM_PAINT消息之外的其他消息,至于WM_PAINT则只有在其处理之后才被删除。 

在创建应用程序最高级别的窗口之前调用PeekMessage会导致创建的窗口在z序列后面,因此需要显示的调用SetForegroundWindow函数显示此窗口。如果应用程序已经有一个窗口在前景,新创建的窗口仍会在前景创建。

l      WaitMessage

当一个线程没有消息在其消息队列中的时候,线程放弃控制权给其他的线程。WaitMessage函数挂起线程,直到一个新的消息被放入线程的消息队列中才返回。

 

BOOL WaitMessage(VOID);

 

参数

       无

返回值

       如果函数执行成功,返回非0.

       如果函数执行失败,返回值为0,调用GetLastError函数获得详细错误信息。

说明

       线程在调用一个函数核查线程消息队列后,如果消息队列中没有可读的消息,WaitMessage函数不会返回。这是因为PeekMessageGetMessageGetQueueStatus、WaitMessageMsgWaitForMultipleObjectsMsgWaitForMultipleObjectsEx这样的函数核对消息队列,改变队列的状态信息这样输入不再被认为是新的。如果连续调用WaitMessage将等到指定类型的新输入到达后才返回。已存在的未读过的输入(在上次线程检查队列之前接收的)被忽略。

PeekMessage和GetMessage函数的主要区别

PeekMessage和GetMessage函数的主要区别有: 1. GetMessage的主要功能是从消息队列中“取出”消息,消息被取出以后,就从消息队列中将其删除;而PeekMessage的主要...
  • gencheng
  • gencheng
  • 2013年07月19日 10:03
  • 13329

正确的使用PeekMessage()

// 使系统无法进入IDLE模式,This PeekMessage loop will NOT let the system go idle.    for( ;; )    {    ...
  • qq445803843
  • qq445803843
  • 2015年04月10日 13:04
  • 854

message C++

  • 2012年09月22日 09:39
  • 485KB
  • 下载

C++中添加自定义消息的响应 (BEGIN_MESSAGE_MAP ON_MESSAGE)

  1首先要在窗口类的cpp文件手动添加消息响应机制,ON_MESSAGE(ID,Handler)  LRESULT   Handler(WPARAM,LPARAM);//响应的函数BEGIN_MES...
  • Jacky_Dai
  • Jacky_Dai
  • 2009年03月26日 16:45
  • 6377

C++ PeekMessage与GetMessage的对比

相同点: PeekMessage函数与GetMessage函数都用于查看应用程序消息队列,有消息时将队列中 的消息派发出去。 不同点: 无论应用程序消息队列是否有消息,PeekMess...
  • u011507161
  • u011507161
  • 2014年10月24日 21:45
  • 597

C++ MessageBox MessageBoxA MessageBoxW AfxMessageBox

转自:http://blog.sina.com.cn/s/blog_5059be880100whu3.html C语言的MessageBox MessageBoxA(     HWND hWnd...
  • Davidlee91
  • Davidlee91
  • 2013年08月08日 17:07
  • 2042

Win32 SDK基础(11)—— 消息队列和GetMessage/PeekMessage、SendMessage/Postmesage

一、消息队列 1.1 消息队列         消息队列是用来存放消息的一个队列,消息在队列中先入先出,所有的窗口程序都具有消息队列,程序可以从队列中获取消息。 1.2 消息队列的类型        ...
  • lzhui1987
  • lzhui1987
  • 2017年04月12日 17:35
  • 916

PeekMessage完美解决MFC主界面无响应

一般主界面无响应的解决方案是,对于计算量过大的方法,另开工作者线程,如下:      MFC支持两种线程:用户界面线程和工作者线程。 (1)用户界面线程:通常用于处理用户输入,...
  • aa1991
  • aa1991
  • 2015年03月20日 16:51
  • 2350

PeekMessage函数用法

在图形系统中,有这么一个「永远」有人执行的有趣程序,它简单地使用随机的大小和色彩绘制一系列矩形。您可以在Windows中建立一个这样的程序,但是它并不像乍看起来那样容易编写。我希望您能认识到,您不能简...
  • JiXuXiangQianZou
  • JiXuXiangQianZou
  • 2013年06月13日 14:11
  • 1462

MFC下的多线程和自定义消息收发

不仅在MFC的程序中,其他设计库如qt,也会存在运行时界面卡死的问题,导致这个问题的原因是内部存在多次循环,界面更新函数处理不过来,消息队列阻塞。为解决这一问题,多线程是首选。也有通过在单线程循环中P...
  • qwtyuiop
  • qwtyuiop
  • 2014年11月17日 21:48
  • 1205
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++中消息函数(3)----PeekMessage和WaitMessage函数
举报原因:
原因补充:

(最多只允许输入30个字)