问题起因
最近在研究游戏脚本,在获取窗口位置时,使用spy++查找得到的窗口得到的边框十分准确;当当我使用win32gui.GetWindowRect()
得到矩形边框时,却发现窗口小了许多。
产生原因
看了这篇博客,找到了问题所在。
自从vista系统开始,窗口有毛玻璃特效边框,而GetWindowRect并没有计算上这部分,所以获取的值会偏小
解决方案
原代码:
pos = win32gui.GetWindowRect(hwnd1)
替换代码:
def get_window_rect(hwnd):try:f = ctypes.windll.dwmapi.DwmGetWindowAttributeexcept WindowsError:f = Noneif f:rect = ctypes.wintypes.RECT()DWMWA_EXTENDED_FRAME_BOUNDS = 9f(ctypes.wintypes.HWND(hwnd),ctypes.wintypes.DWORD(DWMWA_EXTENDED_FRAME_BOUNDS),ctypes.byref(rect),ctypes.sizeof(rect))return rect.left, rect.top, rect.right, rect.bottompos = get_window_rect(hwnd1)
不再使用win32gui.GetWindowRect(),而是自己编写函数get_window_rect(),替换原来的函数,以这种方法得出的矩形坐标就是正确的了。