GetMessage()和PeekMessage()区别

GetMessage()

原型:
BOOL GetMessage(LPMSG lpMsg, HWND hWNd, UINT wMsgFilterMin, UINT wMsgFilterMax);

Retrieves a message from the calling threads queque. The function dispatches incoming sent message until a posted message is available for retrieval.


从调用线程的消息队列中取得一个消息并将该消息放在指定的结构(MSG).此函数可取得与指定窗口联系的消息和由PostThreadMessage寄送的消息。次函数接受一定范围的消息值。由GetMessage不接受属于其他线程或者应用程序的消息。获取消息成功后,线程将从消息队里中删除该消息。

函数会一直等待直到有消息到来才有返回值。

备注:

应用程序通常用返回值来确定是否终止主消息循环并退出程序。
GetMessage值接受与参数hWnd标示的窗口或子窗口相关联的消息。如果hWnd为NULL,则GetMessage接受属于调用线程的窗口消息,线程消息由函数PostThreadMessage()寄送给调用线程。GetMessage不接受其他线程或者其他线程的窗口消息。如果UINT wMsgFilterMin, UINT wMsgFilterMax都为0,则Getmessage返回所有可得到的消息(即,如范围考虑)。

GetMessage不从队列里清除WM.PAINT消息。该消息将保留在队列里直到处理完毕。

...............................................................................

PeekMessage()

原型
BOOL PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMSGfilterMin, UINT wMSGfilterMax, UINT wRemoveMsg)

wRemoveMsg
确定消息如何被处理。此参数可取下列值之一:

PM_NOREMOVE PeekMessage处理后,消息不从队列里除掉。
PM_REMOVE PeekMessage处理后,消息从队列里除掉。
PM_NOYIELD 此标志使系统不释放等待调用程序空闲的线程。可将PM_NOYIELD随意组合到PM_NOREMOVE或PM_REMOVE。


备注:

函数GetMessage不一样的是,GetMessage:从系统获取消息,将消息从系统中移除,属于阻塞函数。当系统无消息时,GetMessage会等待下一条消息。

函数PeekMesssge是以查看的方式从系统中获取消息,可以不将消息从系统中移除,是非阻塞函数;当系统无消息时,返回FALSE,继续执行后续代码。

PeekMessage通常不从队列里清除WM_PAINT消息。该消息将保留在队列里直到处理完毕。但如果WM_PAINT消息有一个空更新区,PeekMessage将从队列里清除WM_PAINT消息。

posted @ 2015-01-21 13:58  披头  阅读(4049)  评论(0编辑  收藏  举报