我正在开发一个将窗口以网格形式放置在屏幕上的应用程序。当在Windows 10上运行时,窗口之间存在巨大的间隙。进一步调查显示GetWindowRect
返回意外的值,包括一个不可见的边框,但我无法让它返回带有可见边框的真实值。
1)这个线程表明这是设计如此,并且可以通过与winver = 6链接来“修复”它。我的环境不允许这样做,但我已经尝试更改PE MajorOperatingSystemVersion
和MajorSubsystemVersion
为6,但没有影响。
2) 同一线程还建议使用DwmGetWindowAttribute
和DWMWA_EXTENDED_FRAME_BOUNDS
从DWM获取真实坐标,这很有效,但需要更改获取窗口坐标的所有位置。它也不允许设置值,因此我们需要反向该过程以便能够设置窗口大小。
3) 这个问题表明它是进程中缺少DPI感知度的原因。无论在清单中设置DPI感知度标志,还是调用SetProcessDpiAwareness
都没有产生任何结果。
4) 凭直觉,我还尝试添加Windows Vista、7、8、8.1和10兼容性标志以及Windows主题清单,但没有任何变化。
这个窗口被移动到0x0, 1280x1024, 假设填满了整个屏幕,当我们查询坐标时,得到相同的值。 然而,实际上这个窗口比较旧版本的Windows中的边框要窄14个像素。我该如何说服Windows让我使用真实的窗口坐标?
GetWindowRect
一样。 - DeannaSetWindowPos
和GetWindowRect
的功能是正常的。您要求边框,系统正在提供边框。唯一的问题是,在Windows 10中,边框是看不见的,所以窗口似乎在错误的位置。Visual Studio IDE有自己的工具窗口,当工具窗口被停靠时,它不使用边框或自定义的NC_PAINT
;当其工具窗口浮动时,它使用默认边框。我想你想要类似的东西? - Barmak ShemiraniDwmGetWindowAttribute()
返回物理坐标,而GetWindowRect()
返回逻辑坐标。因此,在缩放比例不为100%的屏幕上,对于不支持 DPI 的应用程序,边框宽度将会出现错误。 - Ian Goldby