gpt4 book ai didi

winapi - GetWindowRect 返回包含 "invisible"边框的大小

转载 作者:行者123 更新时间:2023-12-03 01:19:09 24 4
gpt4 key购买 nike

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

1) This thread表明这是设计使然,您可以通过与 winver=6 链接来“修复”它。我的环境不允许这样做,但我尝试将 PE MajorOperatingSystemVersionMajorSubsystemVersion 更改为 6,但没有影响

2) 同一条线程还建议使用 DwmGetWindowAttributeDWMWA_EXTENDED_FRAME_BOUNDS 从 DWM 获取真实坐标,这可以工作,但意味着更改获取窗口坐标的所有位置。它也不允许设置该值,因此我们需要逆向该过程才能设置窗口大小。

3) This question表明在此过程中缺乏 DPI 意识。在 list 中设置 DPI 感知标志或调用 SetProcessDpiAwareness 都没有任何结果。

4) 一时兴起,我还尝试添加 Windows Vista、7、8、8.1 和 10 兼容性标志,并且 Windows 主题 list 没有任何更改。

Screenshot of a "fullscreen" window with gaps all round该窗口被移动到 0x0, 1280x1024,据说是为了填满整个屏幕,当查询坐标时,我们得到相同的值。然而,考虑到旧版本 Windows 上的边框,该窗口实际上窄了 14 像素。

如何说服 Windows 让我使用真实的窗口坐标?

最佳答案

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`

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

关于winapi - GetWindowRect 返回包含 "invisible"边框的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34139450/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com