不灭的焱

革命尚未成功,同志仍须努力

作者:php-note.com  发布于:2021-10-07 13:44  分类:Python基础  编辑

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