c++中消息函数(2)----GetMessage函数

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

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

BOOL GetMessage(
  LPMSGlpMsg,         // message information
  HWND hWnd,           // handle to window
  UINT wMsgFilterMin,  // first message
  UINT wMsgFilterMax   // last message
);

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的可能性意味着这个代码可以导致致命的应用错误。相反,可以使用下面的代码:

BOOL bRet;
while(bRet = GetMessage(&msg,hWnd,0,0) !=0)
{
       if(bRet== -1)
       {
       //处理错误和可能的退出
}
else
{
       TranslateMessage(&msg);
       DispatchMessage(&msg);
}
}

说明

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

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坐标、位置、大小和视觉属性。这个镜像窗体允许用户删除、改变大小或者甚至关闭。但是,此种情况仅仅在窗体真正不能响应的情况下产生,当在调试模式下,系统不能产生镜像窗体。

你可能感兴趣的:(C++,timer,input)