PeekMessage() 只能看到发布到消息队列的消息。不包括 WM_SIZE,它是发送的,而不是发布的。或者换句话说,它是由SendMessage()传递的,它直接调用窗口过程,绕过消息队列。所以是的,您的代码开始工作,因为您现在使用 PostMessage 重新发布消息,它被放在消息队列中,因此 PeekMessage 可以看到它。
当用户调整窗口大小时,会发生一些不同的事情。这是由另一条消息报告的:WM_SIZING。当 Windows 启动模式消息循环以实现调整大小操作时,它会以相当高的速率生成。它给出了适当的通知,当模态循环开始时(用户单击窗口角),您将获得 WM_ENTERSIZEMOVE,完成时(用户释放按钮)获得 WM_EXITSIZEMOVE。您将收到一堆 WM_SIZING 消息,发送到您的窗口过程。未发布。和一个 WM_SIZE 给出最终大小。看不到这些消息的这些反映版本的一种方法是在您自己的消息循环中调用 PeekMessage()。当 Windows 模式调整大小循环处于活动状态时,它不会被调用。
很难给出更好的建议,真的不清楚你为什么要这样做。“医生,很痛,那就不要这样做”的医学回答很可能是相关的。我怀疑您可能也想反映 WM_SIZING 消息。最大的问题是,当您从队列中检索这些消息时,窗口大小已经发生了变化,并且通知已经过时了。这就是为什么发送消息而不是发布消息的原因。