l PeekMessage
此函数检查一个线程消息队列中消息,如果消息存在,放置消息到指定的MSG结构体中。
BOOL PeekMessage(
LPMSGlpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax,
UINT wRemoveMsg
);
lpMsg
指向从线程的消息队列接收消息的MSG结构体。
hWnd
需要检索消息的窗体句柄。
wMsgFilterMin
指定被检索的最小消息值的整数。
wMsgFilterMax
指定被检索的最大消息值的整数。
wRemoveMsg
指定消息如何处理。参数如下:
值 | 解释 |
PM_NOREMOVE | PeekMessage处理之后消息不需要从消息队列中移除 |
PM_REMOVE | PeekMessage处理之后消息需要从消息队列中移除。一个特别即是WM_PAINT消息,它不能从消息队列中移除。 |
返回值
如果有一个消息适合,函数返回非0.
如果没有消息适合,函数返回0.
说明
与GetMessage不同的是,PeekMessage函数不会等到有消息放入队列时才返回。
PeekMessage函数检索由hWnd参数标识的和窗体关联的,或者由IsChild函数指定的它们的子窗体,并且在wMsgFilterMin和wMsgFilterMax参数指定的消息范围之间消息。如果hWnd为NULL,则PeekMessage获取属于调用该函数应用程序的任一窗口的消息(PeekMessage不会获取属于其他线程的窗口消息),如果hWnd=-1,那么函数只返回把hWnd参数为NULL的PostTreadMessage函数送去的消息。如果wMsgFilterMin和wMsgFilterMax都是0,则PeekMessage就返回所有可得到的消息。
用WM_KEYFIRST和WM_KEYLAST常量作为过滤器去获取所有键盘消息;用WM_MOUSEFIRST和WM_MOUSELAST常量作为过滤器区域获取所有的鼠标消息。
函数获取之后将删除消息队列中的除WM_PAINT消息之外的其他消息,至于WM_PAINT则只有在其处理之后才被删除。
在创建应用程序最高级别的窗口之前调用PeekMessage会导致创建的窗口在z序列后面,因此需要显示的调用SetForegroundWindow函数显示此窗口。如果应用程序已经有一个窗口在前景,新创建的窗口仍会在前景创建。
l WaitMessage
当一个线程没有消息在其消息队列中的时候,线程放弃控制权给其他的线程。WaitMessage函数挂起线程,直到一个新的消息被放入线程的消息队列中才返回。
BOOL WaitMessage(VOID);
参数
无
返回值
如果函数执行成功,返回非0.
如果函数执行失败,返回值为0,调用GetLastError函数获得详细错误信息。
说明
线程在调用一个函数核查线程消息队列后,如果消息队列中没有可读的消息,WaitMessage函数不会返回。这是因为PeekMessage、GetMessage、GetQueueStatus、WaitMessage、 MsgWaitForMultipleObjects和MsgWaitForMultipleObjectsEx这样的函数核对消息队列,改变队列的状态信息这样输入不再被认为是新的。如果连续调用WaitMessage将等到指定类型的新输入到达后才返回。已存在的未读过的输入(在上次线程检查队列之前接收的)被忽略。