【问题标题】:Why the PeekMessage always return TRUE?为什么 PeekMessage 总是返回 TRUE?
【发布时间】:2026-01-02 00:35:01
【问题描述】:
        // Main 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 );
            }
            else
            {
                Render();
            }
        }

“渲染”功能尚未执行

【问题讨论】:

  • PeekMessage 仅当消息队列中有 WM_QUIT 时才会返回 FALSE。只有那个,没有别的。您必须将 Render 函数移到其他地方,这取决于它应该做什么。
  • @Dialectus 不,队列为空时返回FALSE
  • 好吧,很难猜出你从这个问题中不断收到什么信息。当您不调用 Begin/EndPaint() 时,我会在 WM_PAINT 上反复生成。
  • 哎呀,那里没有GetMessage。大脑慢,手指快……
  • 调试提示:记录消息。查看不断出现的消息并阻止您的渲染运行。然后看看为什么这些消息不断生成。

标签: winapi peekmessage


【解决方案1】:

PeekMessage 文档说明了有关返回值的内容:

如果消息可用,则返回值非零。

如果没有消息可用,则返回值为零。

当消息队列为空时,它确实会返回零,即FALSE。因此,结论是消息队列永远不会为空。对此最可能的解释是,您在 DispatchMessage 中处理的其中一条消息导致同一条消息被发布到队列中。

【讨论】:

  • 在游戏循环中非常标准。
  • 哦,我太粗心了。 WndProc 有一个空箱。
  • 案例 WM_PAINT:中断;所以在消息队列中总是有一个 WM_PAINT