WM_SIZE无法按预期工作

时间:2012-06-11 16:48:00

标签: c winapi window

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

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

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

2 个答案:

答案 0 :(得分:4)

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

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

很难提供更好的建议,我们真的不清楚为什么要这样做。 “医生,它疼,不要那么做”医学答案极有可能是相关的。我怀疑你可能也想反映WM_SIZING消息。最大的问题是,当您从队列中检索这些消息时,窗口大小已经更改,并且通知只是过时的。这就是邮件发送而不发布的原因。

答案 1 :(得分:1)

我认为这是适用的:

  

PeekMessage not getting the message?

     

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

     

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