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)
这应该给你正确的边界矩形.