ITPub博客

首页 > 应用开发 > IT综合 > c++中消息函数 -- GetMessage函数

c++中消息函数 -- GetMessage函数

原创 IT综合 作者:edwardking888 时间:2014-07-29 17:00:21 0 删除 编辑

此函数从调用线程的消息队列中取出一个消息。此函数发送消息队列的消息直到这个消息适合检索。然后把检索到的消息赋值给MSG结构体。

       PeektMessage函数和GetMessage不同,PeekMessage不会等待一个消息发送到消息队列时才返回。


  1. BOOL GetMessage(  
  2.   LPMSGlpMsg,         // message information  
  3.   HWND hWnd,           // handle to window  
  4.   UINT wMsgFilterMin,  // first message  
  5.   UINT wMsgFilterMax   // last message  
  6. );  


lpMsg

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

hWnd

        需要检索消息的窗体句柄。这个窗体必须属于调用线程,下面是指定的值。

解释

 NULL

GetMessage检索任何属于调用线程窗体的消息,并且通过PostThreadMessage函数发送消息到调用线程

wMsgFilterMin

指定被检索的最小消息值的整数。用WM_KEYFIRST指定第一个键盘消息或者WM_MOUSEFIRST指定第一个鼠标消息。

此处用WM_INPUT,wMsgFilterMax中只能用WM_INPUT类型消息。

wMsgFilterMax  

指定被检索的最大消息值的整数。用WM_KEYLAST指定最后一个键盘消息或者WM_MOUSELAST指定最后一个鼠标消息。

此处用WM_INPUT,wMsgFilterMin中只能用WM_INPUT类型消息。

如果wMsgFilterMin和wMsgFiterMax都为0,GetMessage返回所有合适的消息(也就是说没有过滤条件)。

返回值

如果函数检索除WM_QUIT消息之外的消息,返回非0。

如果函数检索WM_QUIT消息,函数返回0。

如果有错误发生,返回值为-1。例如,如果hWnd是一个非法的窗口句柄或者lpMsg是一个非法的指针,函数返回错误。可以通过调用GetLastError函数获得详细的错误信息。

因为返回值可以非0,0或者-1,避免向下面的代码发生:

while(GetMessage(lpMsg,hWnd,0,0))……

返回-1的可能性意味着这个代码可以导致致命的应用错误。相反,可以使用下面的代码:


  1. BOOL bRet;  
  2. while(bRet = GetMessage(&msg,hWnd,0,0) !=0)  
  3. {  
  4.        if(bRet== -1)  
  5.        {  
  6.        //处理错误和可能的退出  
  7. }  
  8. else  
  9. {  
  10.        TranslateMessage(&msg);  
  11.        DispatchMessage(&msg);  
  12. }  
  13. }  


说明

应用通常使用返回值决定是否结束主消息循环并且退出程序。

GetMessage函数检索由hWnd参数标识的和窗体关联的,或者由IsChild函数指定的它们的子窗体,并且在wMsgFilterMin和wMsgFilterMax参数指定的消息范围之间消息。应用只能用wMsgFilterMin和wMsgFilterMax参数的低字位,高字位是系统保留。

GetMassage函数总是检索WM_QUIT消息,不管它是否在wMsgFilterMin和wMsgFilterMax指定的范围内。

在调用期间,系统用SendMessage、SendMessageCallback,、SendMessageTimeout或者SendNotifyMessage函数发送待处理的、非队列的消息,也就是,消息发送给属于调用线程的窗体,然后匹配指定的过滤条件的第一个消息队列被检索。系统也处理内部事件,如果没有指定过滤器,消息处理按照下面的顺序:

  •  Sentmessages(发送消息)
  •  Postedmessages(推送消息)
  •  输入(硬件)消息或者系统内部消息
  •  Sentmessages (again)(发送消息)
  • WM_PAINT消息
  • WM_TIMER消息

在推送消息之前,用wMsgFilterMin和wMsgFilterMax参数检索输入消息。

GetMessage不能从消息队列中移除WM_PAINT消息。此消息一直在消息队列中直到被处理。

如果一个高级别的窗体一段时间内停止响应消息,系统认为窗体没有响应,然后使用一个镜像的窗体代替此窗体,镜像窗体和此窗体有着相同的Z坐标、位置、大小和视觉属性。这个镜像窗体允许用户删除、改变大小或者甚至关闭。但是,此种情况仅仅在窗体真正不能响应的情况下产生,当在调试模式下,系统不能产生镜像窗体。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8183550/viewspace-1241487/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 消息结构体MSG
请登录后发表评论 登录
全部评论

注册时间:2010-04-03

  • 博文量
    477
  • 访问量
    1439892