Win81+ GetWindowRect 不包括完整的拖动区域?

Win81+ GetWindowRect Not Including Complete Drag Area?

我正在尝试获取所有 windows 的宽度和高度。我用 GetWindowRect 轻松做到了这一点,但是 Win8.1+ 中的样式似乎在某些 windows 上有一个边框并且不包括在内。当我 move/drag window 时,这个区域随着 window 移动,所以我预计它会脱离它的几何形状。这是众所周知的吗?是否包含边框宽度?

新示例

在看到评论中有些混乱后,我创建了第二个屏幕截图来解释。

我有两个 windows 并排放置,如下图所示:

现在如果我取左边和右边的 GetWindowRect windows,它应该是围绕这两个 windows 的连续矩形。但是在下面我们看到情况并非如此。我在整个桌面上放了一个黑色淡入淡出,并为每个 window 剪掉了 GetWindowRect 的部分,我们看到左边的 window GetWindowRect 有点小,这个是我的问题。

旧示例

例如这是一个截图,使用cleared/non-black窗帘区域是GetWindowRect确定的宽度高度,x和y:

我们看到window有一些区域没有包括在内,我想这是边界?我在这里使用 photoshop 在所有应该的地方加上了蓝色边框:

为了清楚起见,我在内部放置了一个红色边框,以表明红色和蓝色边框之间的区域应该包括在内,但没有:

有谁知道如何将此 "border" 包含在 GetWindowRect 中?

是的,GetWindowRect() 骗了你。正如你所发现的。这是一个必要的谎言。回到 Vista,第一个 Windows 版本提供了可调整大小 windows 的宽边框。一个非常必要的功能,高屏幕分辨率变得非常普遍,传统的 2 像素边框越来越难以用鼠标点击。

然而,这造成了巨大的兼容性问题,许多创建 window 的程序使用 CreateWindowEx(),您指定 outer window 大小。并且不要使用 AdjustWindowRectEx(),您必须使用该函数来计算您需要的 window 大小。有必要,因为几乎每个 window 实际上都关心 window 的客户端大小。您填充内容的部分。如果他们什么都不做,那么遗留程序最终会创建 windows,客户区太小,不再适合内容或无法对齐。非常非常丑

所以 GetWindowRect() 撒谎并假装 window 具有传统的 2 像素边框。非常一致的谎言,如果您使用 GetSystemMetrics() 询问边框大小,那么您会得到 2,即使它是 5。一切都很好,直到您开始关心彼此相邻的定位 windows。不可能撒谎。

关闭谎言需要让 Windows 知道您知道粗边框的后果。并且知道如何处理 Aero 被关闭的情况,这在 Vista 和 Win7 上是可能的。您必须 select EXE 文件头中的子系统版本号并至少选择 6.00。绝大多数程序使用旧值 4.00。具体如何完成取决于您的工具,对于 Microsoft 链接器,它是 /SUBSYSTEM option。它可以在使用 Editbin.exe, /SUBSYSTEM 选项构建程序后更改。该程序将不再 运行 在 XP 和更早版本上。

Windows 10 对这个问题采用了一种有趣的新方法。细边框又回来了。但是现在有了更大的阴影,鼠标在边界之外是活动的,即使 windows 没有阴影。工作得很好,希望我们都能很快忘记这个 appcompat 细节:)