一、PeekMessage与GetMessage
`PeekMessage`函数可以从消息队列中获取消息,但是不会将该消息从队列中移除,可以理解为偷窥消息。该函数的原型如下:
BOOL PeekMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax,
UINT wRemoveMsg
);
GetMessage`函数会将获取的消息从队列中移除。该函数的原型如下:
BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);
二、区别
-
消息处理方式:
PeekMessage
:这个函数用于检查消息队列中是否有消息等待处理。如果有消息,它会将消息复制到指定的消息结构体,但不会将消息从队列中移除。这意着PeekMessage
不会阻塞程序执行,它会立即返回,无论是否有消息。GetMessage
:与PeekMessage
不同,GetMessage
会将消息从队列中移除并将其复制到指定的消息结构体中。如果队列中没有消息,GetMessage
会阻塞程序的执行,直到有消息到达为止。
-
适用场景:
PeekMessage
:通常用于多线程应用程序或需要非阻塞方式处理消息的情况,例如游戏循环中的消息处理。它允许程序继续执行其他任务而不必等待消息。GetMessage
:通常用于传统的 Windows 应用程序,如窗口应用程序。它会等待消息到达,因此适用于需要响应用户输入的情况。
-
消息处理的方式:
PeekMessage
:可以使用PM_REMOVE
标志来指示是否从队列中移除消息。如果指定了PM_REMOVE
,则消息将被移除,否则不会。这意味着你可以选择是只查看消息还是查看并处理消息。GetMessage
:无论如何,消息都会被移除并返回。
三、实例
下面是一个简单的示例代码,展示了如何使用`PeekMessage`函数和`GetMessage`函数:
HWND hWnd; // 窗口句柄
MSG msg;
while (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
while (GetMessage(&msg, hWnd, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
在以上示例中,调用`PeekMessage`函数和`GetMessage`函数来获取并处理消息。`TranslateMessage`函数用于翻译键盘消息,`DispatchMessage`函数用于分发消息给窗口过程进行处理
参考: