您现在的位置是:网站首页>文章详情文章详情

win32gui的GetWindowRect() 获取窗口坐标不准确问题

inlike2021-11-30 原创文章 浏览(5153) 评论(0) 喜欢(17)

简介windows 7系统开始,Python通过win32gui.GetWindowRect()获取窗口坐标不准确,有一定的误差。

windows 7系统开始,Python通过win32gui.GetWindowRect()获取窗口坐标不准确,有一定的误差。在stackoverflow上有关于此问题的讨论,点击查看链接,大致原因见下所示。

Vista 下未与 WINVER=6 链接的应用程序将在此处收到一组误导性的值,这些值并未考虑 Vista Aero 应用于窗口的“玻璃”像素的额外填充。即使在 Aero Basic(无玻璃)中,这似乎也会发生,以保持尺寸一致性。解决方法(如果不想设置WINVER=6)好像是动态绑定到dwmapi.dll,使用GetProcAddress()获取DwmGetWindowAttribute()函数,并用DWMWA_EXTENDED_FRAME_BOUNDS参数调用来请求正版窗口框架尺寸。

在Python3中可以通过下面的方法来获取准确的坐标:

from ctypes import wintypes
import ctypes


def get_window_pos(hwnd):
    try:
        f = ctypes.windll.dwmapi.DwmGetWindowAttribute
        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
    except WindowsError as e:
        raise e

get_window_pos方法的hwnd参数是句柄,返回窗口左上角坐标和高宽。

2cf5e0fe9925bc31e82cefd855df8db1cb137079.jpg


很赞哦! ( 17)
    《Python实战进阶》
    None
    None
    夏至已深

站点信息

  • 建站时间:2019-5-24
  • 网站程序:like in love
  • 主题模板《今夕何夕》
  • 文章统计:104条
  • 文章评论:***条
  • 微信公众号:扫描二维码,关注我们
  • 个人微信公众号