此函数从调用线程的消息队列中取出一个消息。此函数发送消息队列的消息直到这个消息适合检索。然后把检索到的消息赋值给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函数发送待处理的、非队列的消息,也就是,消息发送给属于调用线程的窗体,然后匹配指定的过滤条件的第一个消息队列被检索。系统也处理内部事件,如果没有指定过滤器,消息处理按照下面的顺序:
在推送消息之前,用wMsgFilterMin和wMsgFilterMax参数检索输入消息。
GetMessage不能从消息队列中移除WM_PAINT消息。此消息一直在消息队列中直到被处理。
如果一个高级别的窗体一段时间内停止响应消息,系统认为窗体没有响应,然后使用一个镜像的窗体代替此窗体,镜像窗体和此窗体有着相同的Z坐标、位置、大小和视觉属性。这个镜像窗体允许用户删除、改变大小或者甚至关闭。但是,此种情况仅仅在窗体真正不能响应的情况下产生,当在调试模式下,系统不能产生镜像窗体。