2

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

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

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

4

2 回答 2

5

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

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

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

于 2012-06-11T17:31:36.797 回答
1

我相信这是适用的:

PeekMessage 没有收到消息?

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

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

于 2012-06-11T17:13:26.963 回答