函数功能:
PeekMessage 函数检查线程的消息队列并获取消息(如果存在的话)。
API 函数原型:
BOOL WINAPI PeekMessage( _Out_ LPMSG lpMsg, _In_opt_ HWND hWnd, _In_ UINT wMsgFilterMin, _In_ UINT wMsgFilterMax, _In_ UINT wRemoveMsg );
参数解析:
|
参数 |
含义 |
||||||||||||||||||
|
lpMsg |
指向 MSG 结构的指针,用于存放获取到的消息 |
||||||||||||||||||
|
hWnd |
1. 需要获取消息的窗口的句柄,该窗口必须属于当前线程 |
||||||||||||||||||
|
wMsgFilterMin |
指定被可以被获取的消息值的最小整数(消息其实就是一个被定义的整数) |
||||||||||||||||||
|
wMsgFilterMax |
指定被可以被获取的消息值的最小整数 |
||||||||||||||||||
|
wRemoveMsg |
指定消息如何被处理(该值可以是下边一个或多个组合):
|
返回值:
1. 如果获取到有效的消息,返回值是非 0;
2. 如果获取不到消息,返回值是 0。
备注:
1. 如果 hWnd 参数不为零,则 PeekMessage 函数只获取属于 hWnd 窗口的消息,以及被 IsChild 函数确定为 hWnd 的子窗口的消息;
2. wMsgFilterMin 和 wMsgFilterMax 参数限定消息获取的范围,如果二者都为 0,则消息获取的范围为所有消息;
3. 注意,即便你通过 wMsgFilterMin 和 wMsgFilterMax 参数限定消息获取的范围,但 WM_QUIT 不受此范围影响(无法阻止此消息被 PeekMessage 函数获取);
4. 调用此函数的过程中,如果接收到非排队消息 —— 也就是由该线程调用 SendMessage, SendMessageCallback, SendMessageTimeout, 或 SendNotifyMessage 发送给所属窗口的消息 —— 系统先暂时挂起等待,然后再获取过滤器匹配的第一个队列消息。如果不指定过滤器,那么按照以下顺序获取消息:
- Sent messages
- Posted messages
- Input (hardware) messages and system internal events
- Sent messages (again)
- WM_PAINT messages
- WM_TIMER messages
5. PeekMessage 函数通常不会从消息队列中删除 WM_PAINT 消息,WM_PAINT 会持续保留在消息队列中直到它们被处理,除非一个 WM_PAINT 消息指定的区域为 NULL。
小甲鱼注释:大家应该还记得有三个消息 WM_QUIT, WM_PAINT, WM_TIMER 会被特殊处理,它们总是放在队列的最后面,直到没有其它消息的时候才被处理,连续的 WM_PAINT 消息将被合并成一个以提高绘图效率。
6. 如果一个顶层窗口停止响应的消息超过几秒钟,系统认为窗口没有响应,并使用一个备用窗口替代,该窗口具有相同的 Z 序列、位置、尺寸和视觉属性。这使得用户可以移动、调整大小,甚至关闭该应用程序。然而,这些仅仅是动作,现有的程序事实上仍然没有响应(为了提高用户体验而制作的假象)。当一个程序被调试时,系统并不会为其生成备用窗口。




