C++ WM_ENTERSIZEMOVE/WM_EXITSIZEMOVE-使用菜单时,不总是配对

C++ WM_ENTERSIZEMOVE/WM_EXITSIZEMOVE-使用菜单时,不总是配对,c++,winapi,C++,Winapi,为了防止应用程序在用户移动窗口时更改窗口内容,我捕获消息WM_ENTERSIZEMOVE/WM_EXITSIZEMOVE,并在消息之间暂停应用程序。然而,有时我会收到WM\u ENTERSIZEMOVE,但根本没有WM\u EXITSIZEMOVE。其中一项建议是: 打开窗口菜单 点击大小 不要调整窗口大小,而是单击窗口 请注意,窗口从未收到任何WM_EXITSIZEMOVE 在检查其工作原理时,我还检查了MicrosoftDirectX示例,并注意到了相同的问题。按照上面的复制步骤操作后,

为了防止应用程序在用户移动窗口时更改窗口内容,我捕获消息
WM_ENTERSIZEMOVE
/
WM_EXITSIZEMOVE
,并在消息之间暂停应用程序。然而,有时我会收到
WM\u ENTERSIZEMOVE
,但根本没有
WM\u EXITSIZEMOVE
。其中一项建议是:

  • 打开窗口菜单
  • 点击大小
  • 不要调整窗口大小,而是单击窗口
请注意,窗口从未收到任何
WM_EXITSIZEMOVE

在检查其工作原理时,我还检查了MicrosoftDirectX示例,并注意到了相同的问题。按照上面的复制步骤操作后,示例应用程序看起来已经冻结(我刚刚使用2009年3月SDK中的BasicHLSL示例进行了尝试)


应用程序将如何对此作出响应?是否有其他一些条件应该终止“移动或调整模式循环”

作为临时解决办法,我现在在收到WM_激活消息时取消暂停应用程序。这似乎解决了这个特殊情况(您可以通过再次激活它来恢复应用程序),并且似乎没有破坏任何东西


不过,这种解决方案对我来说很难闻。我宁愿理解它应该如何工作,而不是仅仅依靠有限的测试。

每次完成大小调整操作时,您都应该得到WM_大小消息。 在调整大小时,您将收到WM_调整大小消息


也许你也可以使用这些来取消你的应用程序的暂停?

我知道这已经很晚了,但它仍然可能对你有所帮助,而且它可能会帮助其他在搜索中找到它的人,就像我一样

似乎在您提到的情况下,WM_CAPTURECHANGED消息是在“取消”调整大小时发送的。经过广泛的测试,似乎总是在WM_EXITSIZEMOVE(或应该是!)之前发送,而在WM_ENTERSIZEMOVE/WM_EXITSIZEMOVE之间没有其他阶段发送


WM_CAPTURECHANGED消息也会在其他时间发送,因此只有在发送了WM_ENTERSIZEMOVE消息时,您才应该对其作出反应,但以下WM_EXITSIZEMOVE消息尚未发送。

由于根本没有大小调整操作,因此问题在于重编步骤。大小调整模式循环已进入,但大小调整从未真正开始。这是一个老问题,但因为它是WM_ENTERSIZEMOVE的顶级搜索结果之一:这在Windows 10上不会发生,所以我认为Microsoft已修复该错误。