WM_SIZE 没有按预期工作

Dem*_*ion 2 c winapi window

我有问题WM_SIZE。我想使用PeekMessage(not WndProc)捕获它。PeekMessage永远不会收到WM_SIZE,所以我将额外的用户消息发布到窗口以这样捕获它PeekMessage(来自 的代码WnProc):

case WM_SIZE:
  PostMessageW(hwnd, WM_USER + 1, wParam, lParam);
  break;
Run Code Online (Sandbox Code Playgroud)

问题是我收到WM_USER + 1使用PeekMessage时,才最大化或恢复窗口。当窗口按其粗框调整大小时没有消息(虽然我收到WM_SIZEWndProc)。

Han*_*ant 5

PeekMessage() 只能看到发布到消息队列的消息。不包括 WM_SIZE,它是发送的,而不是发布的。或者换句话说,它是由 SendMessage() 传递的,它直接调用窗口过程并绕过消息队列。所以是的,您的代码开始工作,因为您现在使用 PostMessage 重新发布消息,它被放在消息队列中以便 PeekMessage 可以看到它。

当用户调整窗口大小时会发生一些不同的事情。这是由一条消息报告的:WM_SIZE。当 Windows 启动模式消息循环以实现调整大小操作时,它会以相当高的速率生成。它给出了适当的通知,当模态循环开始时(用户单击窗口角),您将获得 WM_ENTERSIZEMOVE,完成时(用户释放按钮)将获得 WM_EXITSIZEMOVE。你会得到一堆 WM_SIZE 消息,发送到你的窗口过程。没有发布。和一个 WM_SIZE 给出最终大小。一个办法看到这些消息的这些反映的版本是,当你在你自己的消息循环调用的PeekMessage()。当 Windows 模式调整大小循环处于活动状态时,不会调用它。

很难给出更好的建议,目前还不清楚你为什么要这样做。“医生,它很痛,然后不要这样做”医学答案很可能是相关的。我怀疑您可能还想反映 WM_SIZE 消息。最大的问题是,当您从队列中检索这些消息时,窗口大小已经更改,并且通知只是陈旧的。这就是消息被发送而不是发布的原因。

  • 用于调整大小的模态消息循环大概是主顶级消息循环从未看到这些排队消息的原因。 (2认同)