首页 > 解决方案 > 检测 Windows 显示分辨率更改结束

问题描述

我正在尝试为具有以下功能的Windows开发后台实用程序:

  1. 为当前显示分辨​​率Rx存储打开的应用程序窗口的位置
  2. 扫描显示分辨率Rx -> Ry的任何变化(例如,与将我的笔记本电脑与/从其扩展坞对接/脱离相关)
  3. 等待 Windows 完成自动重新定位窗口(混乱的桌面重新配置;见下文)
  4. 恢复先前存储的显示分辨率Ry的窗口位置

我已经成功实现了功能 1、2 和 4。对于功能 2,我拦截了WM_DISPLAYCHANGE事件,告诉我显示分辨率发生了变化。

分辨率发生更改后,Windows会立即自动重新定位许多(如果不是全部)窗口以满足新的显示约束。这个阶段(我称之为混乱的桌面重新配置)会持续几秒钟,并在 Windows 布局中造成真正的混乱(这就是我想要开发上述实用程序的原因)。

现在我有以下问题:

当 Windows 完成混乱的桌面重新配置阶段 (3)时,我只能应用功能 4 。但是,我还没有找到任何可接受的方法来检测此阶段何时结束。

我确实尝试通过拦截事件来观察窗口的自动重新定位EVENT_OBJECT_LOCATIONCHANGE,然后等待最后一个发出。它几乎可以工作:当它发生时我会得到很好的通知,但是,我并不满意,因为这些事件中的每一个之间的时间间隔可以持续长达 5 秒(或者可能更长),这使得很难识别其中的最后一个通过经典的超时方法事件。目前,我已将此超时设置为 10 秒,这并不令人满意,因为我希望能够更早地检测到混乱的桌面重新配置结束,更重要的是,不能保证之后不会发生另一个此类事件超时。

在更改显示分辨率时,有没有人有解决方案来正确检测自动窗口重新定位的结束?

标签: windowswinapiwindows-10

解决方案


推荐阅读