切换监视器时,为什么带有DWMWA_EXTENDED_FRAME_BOUNDS的DwmGetWindowAttribute会出现意外行为?

时间:2018-02-27 07:00:52

标签: c# c++ winforms winapi dwm

当我的WinForm应用程序从主监视器移动到辅助监视器时,这些属性和winapi函数返回的边界(窗口的高度和宽度)值不会改变:

  • Form.Bounds
  • Form.Size
  • GetWindowRect()

sshd.confDwmGetWindowAttribute返回的值会发生巨大变化。

在评论建议后进行编辑:例如,在主监视器 DwmgetWindowAttribute 中返回宽度和高度为DWMWA_EXTENDED_FRAME_BOUNDS的矩形,其他值返回{{ 1}}。考虑到投影占用7个像素,这是连贯的。但是当窗口移动到辅助监视器时, DwmgetWindowAttribute 返回 292, 100 ,其他方法返回相同的306, 107

事实上我的两个显示器的分辨率都是1920 * 1080(但是如果重要的话,比例会有所不同)

问题:为什么会这样发生?只有我或其他人遇到过类似的问题吗?最终我想计算投影大小。还有其他办法吗?

重现:

如果您希望重现此内容,请创建一个winform项目。在构造函数中使用 AllocConsole()分配控制台。为437, 150添加事件处理程序,并将以下代码添加到事件处理程序:

306, 107

1 个答案:

答案 0 :(得分:1)

之所以会得到这个答案,是因为您的DPI比例在一个显示器上为1.5,在另一台显示器上为1.0。可能可以使用GetDpiForWindow进行协调。