Windows 7上的GetWindowRect太小

发布于 2021-01-29 19:19:39

我要解决的实际问题是,我想自动找出窗口周围的边距大小。如果您能找到更好的方法,请务必回答该问题。

为此,我决定对测试窗口进行截图并测量边距。这很简单,因为我希望没有任何边距会变成鲜艳的粉红色,但是我承认这是一个hack。我使用GetWindowRectpy)获取边界框,并使用PIL截取屏幕截图并裁剪到边界框。问题在于,尽管作物运行正常,但边界框不准确。Windows
7“狙击工具”获得正确的尺寸。我该怎么做?

关注者
0
被浏览
46
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我的第一个想法在下面列出,但是,如您所述,如果您确定GetWindowRect返回的值不正确,请参阅下面的“ 解决方案”


    GetSystemMetrics(SM_CXBORDER)GetSystemMetrics(SM_CYBORDER)怎么了?

    您正在使用的方法似乎是一种非常round回的方法,如果可以调用GetWindowRect(),我可以肯定也可以调用GetSystemMetrics()

    另一种可能性是用于GetWindowRect获取窗口的整个边界矩形并GetClientRect获得客户(非边界)区域的边界矩形。

    应该
    给你喜欢的东西(100,200),(1000,900),并(112,227),(988,888)分别就可以制定出顶部边框的227-200,作为底部900-888,左为112-100,右为900-888(27,12,12,12)。


    解析度:

    一些调查发现了这一点。这是2006年的一个话题,指出您可能无法从获得正确的值GetWindowsRect。指向我指出的主题是:

    未与WINVER = 6链接的Vista下的应用程序将在此处接收到一组误导性的值,这些值未考虑Vista
    Aero应用于窗口的“玻璃”像素的额外填充。即使在Aero
    Basic(无玻璃)中,为了保持尺寸一致性,这种情况似乎也会发生。解决方法(如果不想设置WINVER =
    6)似乎是动态绑定到dwmapi.dll并使用GetProcAddress()获得DwmGetWindowAttribute()函数,并使用DWMWA_EXTENDED_FRAME_BOUNDS参数调用它以请求真正的窗口框架尺寸。

    因此,基本上,使用类似的东西(您可能必须使用ctypes从Python进行此操作):

    RECT r;
    HRESULT stat = DwmGetWindowAttribute (
        hwnd,
        DWMWA_EXTENDED_FRAME_BOUNDS,
        &r,
        sizeof(r));
    

    那应该给你正确的边界矩形。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看