当前位置:  开发笔记 > 开发工具 > 正文

GetWindowRect返回包含"不可见"边框的大小

如何解决《GetWindowRect返回包含"不可见"边框的大小》经验,为你挑选了1个好方法。

我正在开发一个应用程序,以网格样式在屏幕上定位窗口.在Windows 10上运行时,窗口之间存在巨大差距.进一步调查显示GetWindowRect返回意外值,包括一个不可见的边框,但我不能让它返回带有可见边框的实际值.

1)这个帖子暗示这是设计的,你可以通过链接winver = 6来"修复"它.我的环境不允许这样,但我已经试图改变PE MajorOperatingSystemVersionMajorSubsystemVersion6个无影响

2)同一个线程还建议使用DwmGetWindowAttributewith DWMWA_EXTENDED_FRAME_BOUNDS从DWM获取真实坐标,这有效,但意味着改变到达窗口坐标的每个地方.它也不允许设置值,让我们反转过程以便能够设置窗口大小.

3)这个问题表明在这个过程中缺乏DPI意识.既没有在清单中设置DPI感知标志,也没有调用SetProcessDpiAwareness任何结果.

4)一时兴起,我还尝试添加Windows Vista,7,8,8.1和10兼容性标志,并且Windows主题清单没有任何变化.

全屏 这个窗口移动到0x0,1280x1024,据说可以填满整个屏幕,当查询坐标时,我们得到相同的值.然而,窗口实际上是14像素更窄,以考虑旧版Windows上的边框.

我怎样才能说服Windows让我使用真实的窗口坐标?



1> Barmak Shemi..:

Windows 10在左侧,右侧和底部具有薄的不可见边框,用于抓住鼠标以进行大小调整.边框可能如下所示:( 7,0,7,7左,上,右,下)

当你打电话SetWindowPos把窗口放在这个坐标时:
0, 0, 1280, 1024

窗口将选择那些精确的坐标,并GetWindowRect返回相同的坐标.但在视觉上,窗口似乎在这里:
7, 0, 1273, 1017

你可以骗过窗户告诉它去这里:
-7, 0, 1287, 1031

为此,我们获得Windows 10边框厚度:

RECT rect, frame;
GetWindowRect(hwnd, &rect);
DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, &frame, sizeof(RECT));

//rect should be `0, 0, 1280, 1024`
//frame should be `7, 0, 1273, 1017`

RECT border;
border.left = frame.left - rect.left;
border.top = frame.top - rect.top;
border.right = rect.right - frame.right;
border.bottom = rect.bottom - frame.bottom;

//border should be `7, 0, 7, 7`

然后像这样偏移矩形:

rect.left -= border.left;
rect.top -= border.top;
rect.right += border.left + border.right;
rect.bottom += border.top + border.bottom;

//new rect should be `-7, 0, 1287, 1031`

除非有更简单的解决方案!


注意,`DwmGetWindowAttribute()`返回物理坐标,但是`GetWindowRect()`返回逻辑坐标。因此,对于非DPI感知的应用程序,如果屏幕缩放到100%以外的任何值,则边框宽度将是错误的。
这会变得更好...此方法仅在显示窗口之后才起作用:(直到那时,DWM函数仅返回与GetWindowRect相同的结果。
推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有