我的第一个想法列在下面,但如果正如你所说,你确定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));
这应该会给你正确的边界矩形。