0

这个 Win32 消息循环内部到底发生了什么?我知道这TranslateMessage是将键码转换为 UTF 字符码并发送WM_CHAR事件,但是到底PeekMessage要做什么呢?它是否过滤掉某种类型的消息并只翻译那些消息?

// Application / Player message loop.
MSG msg;
ZeroMemory(&msg, sizeof(msg));

while(msg.message != WM_QUIT)
{
    if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

   // work happens here...
}
4

2 回答 2

4

通常消息循环将使用GetMessage而不是PeekMessage. 不同的是PeekMessage立即返回。TRUE如果删除了消息,或者FALSE没有获取消息,则返回。另一方面,如果队列为空,则GetMessage阻塞直到消息到达。

重点是说明工作发生在这里的评论。大概作者有一些理由说明正常的阻塞消息循环是不够的。问题中非阻塞消息循环代码的缺点是它是一个繁忙的循环。它不会闲置,因此它将完全消耗 CPU,除非Sleep()您已取消调用或类似调用。

在评论中,您说您实际上只想拉出键盘消息,并且只是针对特定窗口的消息。你需要这样调用PeekMessage

PeekMessage(&msg, hwnd, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE)
于 2013-03-28T20:03:54.213 回答
2

它只是一种获取消息的非阻塞方式。它检查是否有消息,如果有,则将其从队列中取出并放入 &msg。

检查文档

第二个参数表示要查看哪个窗口。在这种情况下,它是“线程中的所有窗口”。

第三个和第四个参数 do 让您指定是否需要键盘或鼠标事件,但当前设置为“all”。

于 2013-03-28T20:00:51.587 回答