在获取窗口位置时,使用spy++查找得到的窗口得到的边框十分准确,但当我使用win32gui.GetWindowRect()
得到矩形边框时,却发现窗口小了许多。
问题原因:
自从vista系统开始,窗口有毛玻璃特效边框,而GetWindowRect并没有计算上这部分,所以获取的值会偏小
解决方案:
# 原来代码
left, top, right, bottom = win32gui.GetWindowRect(self.hwnd_main)
# 替换后的代码
from ctypes import * from ctypes.wintypes import * def get_window_rect(hwnd): try: f = ctypes.windll.dwmapi.DwmGetWindowAttribute except WindowsError: f = None if f: rect = ctypes.wintypes.RECT() DWMWA_EXTENDED_FRAME_BOUNDS = 9 f(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.bottom pos = get_window_rect(hwnd1)
注意
返回的值分别为:
(1)窗体左边离屏幕最左边的距离;
(2)窗体顶边离屏幕最顶边的距离;
(3)窗体右边离屏幕最左边的距离;
(4)窗体底边离屏幕最顶边的距离;