Windows 7 上的 GetWindowRect 太小

2024-04-01

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

为此,我决定截取测试窗口的屏幕截图并测量边距。这很简单,因为我预计任何边距都不会是亮粉色,但我承认这是一个黑客行为。我用获取窗口矩形 http://msdn.microsoft.com/en-us/library/ms633519%28VS.85%29.aspx (py http://timgolden.me.uk/pywin32-docs/win32gui__GetWindowRect_meth.html) 获取边界框,并且PIL http://www.pythonware.com/library/pil/handbook/imagegrab.htm抓取屏幕截图并裁剪到边界框。问题是,虽然裁剪操作正确,但边界框是不准确 https://i.stack.imgur.com/xAUti.png。 Windows 7“截图工具”获得正确的尺寸 https://i.stack.imgur.com/9nCgf.png。我怎样才能做同样的事情?


我的第一个想法列在下面,但如果正如你所说,你确定GetWindowRect返回不正确的值,请参阅解决再向下。


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

您使用的方法似乎是一种非常迂回的方法,如果您可以调用GetWindowRect(),我很确定你可以打电话GetSystemMetrics() http://msdn.microsoft.com/en-us/library/ms724385%28VS.85%29.aspx以及。

另一种可能性是使用GetWindowRect https://msdn.microsoft.com/en-us/library/ms633519.aspx获取窗口的整个边界矩形GetClientRect http://msdn.microsoft.com/en-us/library/ms633503%28VS.85%29.aspx获取客户(非边框)区域的边界矩形。

This should给你类似的东西(100,200),(1000,900) and (112,227),(988,888)分别,你可以计算出顶部边框227-200,底部为900-888,左为112-100就如900-888(27,12,12,12)。


解决:

一些调查出现了this http://social.msdn.microsoft.com/Forums/en-US/windowsuidevelopment/thread/6c1c67a9-5548-4e9b-989f-c7dbac0b1375/。这是 2006 年的一个帖子,指出您可能无法从GetWindowsRect。向我指出这一点的线程指出:

Vista 下未与 WINVER=6 链接的应用程序将在此处收到一组误导性的值,这些值不考虑 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));

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows 7 上的 GetWindowRect 太小 的相关文章

随机推荐