我有问题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_SIZE了WndProc)。
PeekMessage() 只能看到发布到消息队列的消息。不包括 WM_SIZE,它是发送的,而不是发布的。或者换句话说,它是由 SendMessage() 传递的,它直接调用窗口过程并绕过消息队列。所以是的,您的代码开始工作,因为您现在使用 PostMessage 重新发布消息,它被放在消息队列中以便 PeekMessage 可以看到它。
当用户调整窗口大小时会发生一些不同的事情。这是由另一条消息报告的:WM_SIZE。当 Windows 启动模式消息循环以实现调整大小操作时,它会以相当高的速率生成。它给出了适当的通知,当模态循环开始时(用户单击窗口角),您将获得 WM_ENTERSIZEMOVE,完成时(用户释放按钮)将获得 WM_EXITSIZEMOVE。你会得到一堆 WM_SIZE 消息,发送到你的窗口过程。没有发布。和一个 WM_SIZE 给出最终大小。一个办法不看到这些消息的这些反映的版本是,当你在你自己的消息循环调用的PeekMessage()。当 Windows 模式调整大小循环处于活动状态时,不会调用它。
很难给出更好的建议,目前还不清楚你为什么要这样做。“医生,它很痛,然后不要这样做”医学答案很可能是相关的。我怀疑您可能还想反映 WM_SIZE 消息。最大的问题是,当您从队列中检索这些消息时,窗口大小已经更改,并且通知只是陈旧的。这就是消息被发送而不是发布的原因。
| 归档时间: |
|
| 查看次数: |
2795 次 |
| 最近记录: |