GetMessage 是个阻塞函数
从系统获取消息,将消息从系统中移除,阻塞函数。当系统无消息时,会等候下一条消息。
PeekMessage非阻塞函数
以查看的方式从系统获取消息,可以不将消息从系统移除,非阻塞函数。当系统无消息时,返回FALSE,继续执行后续代码。
BOOL WINAPI PeekMessageA(
_Out_ LPMSG lpMsg,
_In_opt_ HWND hWnd,
_In_ UINT wMsgFilterMin,
_In_ UINT wMsgFilterMax,
_In_ UINT wRemoveMsg // 移除标识 PM_REMOVE/PM_NOREMOVE
);
示例代码:
MSG msg = { 0 };
// while (GetMessage(&msg, NULL, 0, 0))
while (true)
{
// 不停提取消息,提取消息后从消息队列当中去掉
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
// 收到此消息后跳出循环(这里最好利用 GetMessage的返回值进行程序的退出)
if (msg.message == WM_QUIT)
{
break;
}
WriteConsole(g_hOutput, "get msg\n", strlen("get msg\n"), NULL, NULL);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
// 空闲处理
WriteConsole(g_hOutput, "OnIdle", strlen("OnIdle"), NULL, NULL);
}
}