
GetMessage 和 PeekMessage 是 Windows API 中用于处理消息队列的函数,主要用于应用程序的消息循环。它们的主要区别在于处理消息队列为空时的行为、返回值以及可选的移除选项。下面详细说明:
主要区别:
- 阻塞行为:
- GetMessage:如果消息队列为空,它会阻塞当前线程(即挂起等待),直到有新消息进入队列才会返回。这适合标准的消息驱动应用程序,确保线程在无消息时不消耗 CPU。
- PeekMessage:如果消息队列为空,它会立即返回,而不会阻塞线程。这允许应用程序在无消息时执行其他任务,如游戏中的实时渲染或动画。
- 消息移除:
- GetMessage:总是从队列中移除检索到的消息。
- PeekMessage:默认移除消息(使用 PM_REMOVE 标志),但可以通过 PM_NOREMOVE 标志选择不移除消息,让消息留在队列中供后续处理。
- 返回值:
- GetMessage:如果检索到的消息不是 WM_QUIT,则返回 TRUE;如果是 WM_QUIT,则返回 FALSE(通常用于退出消息循环)。如果发生错误,返回 -1。
- PeekMessage:如果成功检索到消息,返回 TRUE;如果队列为空,返回 FALSE。
- 使用场景:
- GetMessage 常用于标准的阻塞式消息循环(如 WinMain 中的 while 循环),确保高效的资源使用。
- PeekMessage 常用于需要非阻塞处理的场景,如需要周期性更新 UI 或处理实时事件的应用程序。
示例代码(伪代码):
标准 GetMessage 循环:
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
非阻塞 PeekMessage 循环:
while (running) {
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
if (msg.message == WM_QUIT) break;
TranslateMessage(&msg);
DispatchMessage(&msg);
} else {
// 执行其他任务,如渲染或计算
}
}
消息过滤参数详解
在 Windows 消息处理中,GetMessage 和 PeekMessage 函数共享类似的消息过滤参数,主要包括 wMsgFilterMin 和 wMsgFilterMax,用于指定要检索的消息 ID 范围。这些参数允许开发者精确控制从消息队列中获取哪些类型的消息(如键盘、鼠标或特定系统消息)。此外,PeekMessage 还有额外的 wRemoveMsg 参数,用于控制是否移除消息。下面基于官方文档进行详细解释。
1. 共同参数:wMsgFilterMin 和 wMsgFilterMax
这两个参数定义了消息过滤的范围,只检索消息 ID(即 WM_ 常量)在 [wMs
1万+




被折叠的 条评论
为什么被折叠?



