2012-06-11 256 views
2

我遇到了问题WM_SIZE。我想用PeekMessage(而不是WndProc)捕获它。 PeekMessage从不接收WM_SIZE,所以后额外的用户消息给窗口PeekMessage捕获像这样(代码从WnProc):WM_SIZE不按预期方式工作

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

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

+0

用spy ++看了吗? – bmargulies

+0

你从WndProc发布了你的'WM_USER + 1'消息吗? – Benlitz

+0

是的,我从我的WndProc发布WM_USER + 1,因为PeekMessage本身永远不会收到WM_SIZE。我检查了PostMessageW,并且每次调整窗口大小时都会调用返回成功。但是PeekMessage只有在窗口被创建,最大化,恢复时才会收到它(不是当它被粗框架调整大小时)。 – Demion

回答

4

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

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

很难给出更好的建议,真的不清楚为什么你这样做。 “医生,它伤害,不这样做”医疗答案很可能是相关的。我怀疑你也可能想反映WM_SIZING消息。最大的问题是,当你从队列中检索这些消息时,窗口大小已经改变,通知只是简单陈旧。这就是为什么该消息被发送并未被发布。

+2

用于调整大小的模态消息循环大概是为什么主要顶级消息循环从未看到这些排队的消息。 –

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

+0

我见过这个问题。这不是我的问题的实际答案。这可能是另一种解决方案,但不是按照我的要求(使用PeekMessage接收每个WM_SIZE或WM_USER + 1)。 – Demion

+1

@Demion:但这个答案消除了你的工作需求。如果你能解决真正的问题,为什么试图解决这个问题? –