【问题标题】:WM_SIZE doesnt work as expectedWM_SIZE 没有按预期工作
【发布时间】:2012-06-14 14:31:22
【问题描述】:

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

case WM_SIZE:
  PostMessageW(hwnd, WM_USER + 1, wParam, lParam);
  break;

问题是我仅在窗口最大化或恢复时使用PeekMessage 收到WM_USER + 1。当窗口被粗框调整大小时没有消息(虽然我在WndProc 中收到WM_SIZE)。

【问题讨论】:

  • 您从WndProc 发布您的WM_USER+1 消息?
  • 是的,我从我的 WndProc 发布 WM_USER + 1,因为 PeekMessage 本身永远不会收到 WM_SIZE。我检查了 PostMessageW,每次调整窗口大小时都会调用它返回成功。但是 PeekMessage 只有在窗口被创建、最大化、恢复时才会收到它(而不是在通过粗框调整大小时)。
  • 您很可能选择了错误的解决方案来解决您的问题。但在不了解问题的情况下,我们无法就正确的解决方案向您提供建议。

标签: c winapi window


【解决方案1】:

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

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

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

【讨论】:

  • 用于调整大小的模式消息循环大概是主顶级消息循环从未看到这些排队消息的原因。
【解决方案2】:

我认为这是适用的:

PeekMessage not getting the message?

您需要将类指针传递给调用的最后一个参数 到 CreateWindowEx,然后从 LPCREATESTRUCT 检索该指针 在 WM_CREATE 的 LPARAM 中传递给您,您的类指针将是 在结构的 lpCreateParmas 字段中。将您的类指针设置为 您窗口的 GWLP_USERDATA 以及任何其他消息调用, 调用 GetWindowsLong ,检索您的类指针,然后传递 message、wparam 和 lparam 都转到您的内部类消息 处理程序。

http://msdn.microsoft.com/en-us/library/ff381400%28v=VS.85%29.aspx

【讨论】:

  • 我看过这个问题。这不是我问题的实际答案。这可能是另一种解决方案,但不是我要求的(使用 PeekMessage 接收每个 WM_SIZE 或 WM_USER + 1)。
  • @Demion:但是这个答案消除了您工作的需要。如果可以解决真正的问题,为什么还要尝试解决问题?
猜你喜欢
  • 2021-10-19
  • 2020-03-18
  • 2014-11-15
  • 1970-01-01
  • 2012-07-02
  • 2011-09-07
  • 2013-03-03
  • 2015-05-18
  • 2018-12-31
相关资源
最近更新 更多