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

时间:2015-08-08 19:36:24

标签: winapi rect

我试图获得所有窗户的宽度和高度。我使用GetWindowRect很容易做到这一点,但Win8.1 +中的样式似乎在某些窗口上有一个边框,而且没有包含它。当我移动/拖动窗口时,此区域随窗口移动,因此我预计它将与其几何形状分开。这知道吗?是否包含边界宽度?

新例子

我在评论中看到一些混淆后创建了第二个截图来解释。

我有两个并排的窗口,如下图所示:

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

旧例子

例如,这是一个截图,使用已清除/非黑色窗帘区域GetWindowRect标识为宽度高度x和y:

我们看到窗口的某些区域没有包含在内,我认为这是边界?我在这里用photoshop把蓝色边框放在应有的地方:

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

有谁知道如何在GetWindowRect

中加入此“边框”

1 个答案:

答案 0 :(得分:3)

是的,GetWindowRect()骗你。你发现了。这是一个必要的谎言。回到Vista,这是第一个Windows版本,它为可调整大小的窗口提供了肥胖的边框。一个非常必要的功能,高屏幕分辨率变得非常普遍,传统的2像素边框变得太难以用鼠标击中。

这造成了巨大的兼容性问题,但是,许多创建窗口的程序都使用CreateWindowEx(),您指定外部窗口大小。并且不要使用AdjustWindowRectEx(),您必须使用该函数来计算所需的窗口大小。必要,因为几乎每个窗口实际上都关心窗口的客户端大小。您填写内容的部分。如果他们没有做任何事情,那么遗留程序将最终创建窗口,其客户区域太小,不再适合内容或将其排除在外。非常非常难看。

因此,GetWindowRect()会假装该窗口具有传统的2像素边框。相当一致的谎言,如果你用GetSystemMetrics()询问边框大小,那么你会得到2回,即使它是5.所有工作都很好,直到你开始关心彼此相邻的定位窗口。不可能撒谎。

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

Windows 10采用了一种有趣的新方法来解决这个问题。瘦骨边框回来了。但是现在有一个更大的阴影,鼠标在边界之外是活跃的,即使对于没有阴影的窗户也是如此。工作得很好,希望我们都可以很快忘记这个appcompat细节:)