GetMessage

来源:互联网 发布:mac系统下gem安装sass 编辑:程序博客网 时间:2024/05/22 19:16

从调用线程的消息队列中检索消息。该函数调度传入的发送消息,直到发送的消息可用于检索。
与GetMessage不同,PeekMessage函数不等待返回前发送消息。

BOOL WINAPI GetMessage(  _Out_ LPMSG lpMsg,  _In_opt_ HWND hWnd,  _In_ UINT wMsgFilterMin,  _In_ UINT wMsgFilterMax);

参数
lpMsg [out]
类型:LPMSG
指向从线程的消息队列接收消息信息的MSG结构的指针。


hWnd [in,可选]
类型:HWND
要检索其消息的窗口的句柄。该窗口必须属于当前线程。
如果hWnd为NULL,则GetMessage将检索属于当前线程的任何窗口的消息,以及hwnd值为NULL的当前线程的消息队列中的任何消息(请参阅MSG结构)。因此,如果hWnd为NULL,则处理窗口消息和线程消息。
如果hWnd为-1,则GetMessage仅检索当前线程的消息队列中的hwnd值为NULL的消息,即PostMessage发布的线程消息 (hWnd参数为NULL时)或PostThreadMessage。


wMsgFilterMin [in]
类型:UINT
要检索的最低消息值的整数值。使用WM_KEYFIRST(0x0100)指定第一个键盘消息或WM_MOUSEFIRST(0x0200)来指定第一个鼠标消息。
在这里和wMsgFilterMax中使用WM_INPUT来仅指定WM_INPUT消息。
如果wMsgFilterMin和wMsgFilterMax都为零,GetMessage返回所有可用的消息(即不执行范围过滤)。


wMsgFilterMax [in]
类型:UINT
要检索的最高消息值的整数值。使用WM_KEYLAST指定最后一个键盘消息或WM_MOUSELAST来指定最后一个鼠标消息。
在这里和wMsgFilterMin中使用WM_INPUT来仅指定WM_INPUT消息。
如果wMsgFilterMin和wMsgFilterMax都为零,GetMessage返回所有可用的消息(即不执行范围过滤)。


返回值
类型:BOOL
如果函数检索到除WM_QUIT之外的消息,则返回值不为零。
如果函数检索到WM_QUIT消息,返回值为零。
如果有错误,返回值为-1。例如,如果hWnd是无效的窗口句柄或lpMsg是无效指针,则该函数将失败。要获取扩展错误信息,请调用GetLastError。
因为返回值可以是非零,零或-1,所以避免这样的代码:

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

在hWnd是无效参数(例如引用已经被破坏的窗口)的情况下,返回值的可能性意味着这样的代码可能导致致命的应用程序错误。而是使用如下代码:

BOOL bRet;while((bRet = GetMessage(&msg,hWnd,0,0))!= 0){     if(bRet == -1)    {        //处理错误并可能退出    }    其他    {        的TranslateMessage(MSG);         DispatchMessage函数(MSG);     }}

备注
应用程序通常使用返回值来确定是否结束主消息循环并退出程序。
所述的GetMessage函数检索与由标识的窗口相关联的消息的hWnd参数或其任何儿童,由指定IsChild功能,并且通过给定的消息的值的范围内wMsgFilterMin和wMsgFilterMax参数。
请注意,应用程序只能使用wMsgFilterMin和wMsgFilterMax参数中的低字; 高字保留给系统。
请注意,GetMessage始终检索WM_QUIT消息,无论您为wMsgFilterMin和wMsgFilterMax指定了哪些值。
在此呼叫期间,系统提供待处理的非排队消息,即使用SendMessage,SendMessageCallback,SendMessageTimeout或SendNotifyMessage函数发送到调用线程拥有的窗口的消息。然后检索与指定的过滤器匹配的第一个排队的消息。
该系统还可以处理内部事件。如果未指定过滤器,则按以下顺序处理消息:

  • 发送信息
  • 发布消息
  • 输入(硬件)消息和系统内部事件
  • 发消息(再次)
  • WM_PAINT消息
  • WM_TIMER消息


要在发布消息之前检索输入消息,请使用wMsgFilterMin和wMsgFilterMax参数。
GetMessage不会从队列中删除WM_PAINT消息。消息保留在队列中,直到处理完毕。
如果顶级窗口停止响应消息超过几秒钟,系统会将该窗口视为不响应,并使用具有相同z阶,位置,大小和视觉属性的ghost窗口替换该窗口。这允许用户移动它,调整大小,甚至关闭应用程序。
但是,这些是唯一可用的操作,因为应用程序实际上没有响应。当处于调试器模式时,系统不会生成鬼窗口。

原创粉丝点击