在获取窗口位置时,使用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)窗体底边离屏幕最顶边的距离;