GetWindowRect在Windows 7上太小了

Dev*_*rre 12 python windows winapi pywin32

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

为此,我决定拍摄测试窗口的屏幕截图并测量边距.这很简单,因为我预计没有任何边缘会变成鲜艳的粉红色,但我承认这是一个黑客.我使用GetWindowRect(py)获取边界框,并使用PIL抓取屏幕截图并裁剪到边界框.问题是当裁剪操作正确时,边界框不准确.Windows 7"截图工具"获得正确的尺寸.我怎么能这样做?

pax*_*blo 18

我的第一个想法列在下面,但如果你说,你肯定GetWindowRect会返回不正确的值,请参阅下面的RESOLUTION.


"这有什么错GetSystemMetrics(SM_CXBORDER)GetSystemMetrics(SM_CYBORDER)

你正在使用的方法似乎是一种非常迂回的方式,如果你可以打电话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.指向我的线索说明:

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));
Run Code Online (Sandbox Code Playgroud)

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