当前位置: 代码网 > it编程>前端脚本>Python > Python使用mss获取窗口图片的方法

Python使用mss获取窗口图片的方法

2025年10月15日 Python 我要评论
您在使用mss时遇到的modulenotfounderror表明当前环境未安装该库。以下是完整解决方案,包含安装指导、代码逻辑详解及常见问题处理:1. 安装依赖库(需在本地执行)pip install

您在使用mss时遇到的modulenotfounderror表明当前环境未安装该库。以下是完整解决方案,包含安装指导、代码逻辑详解及常见问题处理:

1. 安装依赖库(需在本地执行)

pip install mss pywin32

2. 使用mss获取窗口图片的详细步骤

步骤1:获取窗口句柄及精确坐标

import win32gui
from mss import mss

# 获取窗口句柄
hwnd = win32gui.findwindow(none, "记事本")  # 替换为实际窗口标题
if hwnd == 0:
    raise exception("未找到目标窗口")

# 获取窗口客户区坐标(排除标题栏/边框)
left, top, right, bot = win32gui.getclientrect(hwnd)
win32gui.clienttoscreen(hwnd, (left, top))  # 转换为屏幕绝对坐标

步骤2:配置mss截图参数

with mss() as sct:
    # 定义截图区域(精确到客户区)
    monitor = {
        "left": left,
        "top": top,
        "width": right - left,
        "height": bot - top
    }
    
    # 捕获屏幕区域
    sct_img = sct.grab(monitor)
    
    # 保存为png(自动处理bgra转rgb)
    sct_img = sct_img.convert("rgb")
    sct_img.save("window_mss.png")

3. 关键问题处理

问题1:坐标偏移(如标题栏/边框)

  • 原因getwindowrect返回的是窗口外部矩形,包含非客户区。
  • 解决:使用getclientrect + clienttoscreen组合获取客户区绝对坐标,确保截图仅包含内容区域。

问题2:dpi缩放导致尺寸错误

检测方法

from ctypes import windll
dpi = windll.user32.getdpiforwindow(hwnd)
scale = dpi / 96.0  # 96为基准dpi
adjusted_width = int((right - left) * scale)

处理:在monitor字典中使用调整后的尺寸。

问题3:多显示器坐标系差异

  • 验证:使用ctypes.windll.user32.getmonitorinfo获取显示器物理范围。
  • 示例
monitor_info = {}
ctypes.windll.user32.getmonitorinfoa(ctypes.windll.user32.monitorfromwindow(hwnd, 1), ctypes.byref(monitor_info))
print("显示器工作区:", monitor_info["rcwork"])

4. 完整修正代码

import win32gui
from mss import mss
import ctypes

# 获取窗口句柄
hwnd = win32gui.findwindow(none, "记事本")
if hwnd == 0:
    raise exception("未找到记事本窗口")

# 获取客户区坐标
left, top, right, bot = win32gui.getclientrect(hwnd)
win32gui.clienttoscreen(hwnd, (left, top))

# 处理dpi缩放
dpi = ctypes.windll.user32.getdpiforwindow(hwnd)
scale = dpi / 96.0
adjusted_left = int(left * scale)
adjusted_top = int(top * scale)
width = int((right - left) * scale)
height = int((bot - top) * scale)

# 使用mss截图
with mss() as sct:
    monitor = {
        "left": adjusted_left,
        "top": adjusted_top,
        "width": width,
        "height": height
    }
    sct_img = sct.grab(monitor)
    sct_img = sct_img.convert("rgb")  # 转换颜色格式
    sct_img.save("corrected_window.png")

print("截图已保存,尺寸:{}x{}".format(width, height))

5. 跨平台适配建议

macos/linux:使用quartzxlib替代win32gui,逻辑类似:

# macos示例(通过quartz获取窗口id)
from quartz import cgwindowlistcopywindowinfo
windows = cgwindowlistcopywindowinfo(kcgwindowlistoptionall)
target_window = [w for w in windows if "记事本" in w.get("kcgwindowname", "")][0]
bounds = target_window["kcgwindowbounds"]

6. 验证与调试技巧

  • 坐标验证:使用print(monitor)输出截图区域坐标,与实际窗口对比。
  • 边界测试:在纯色桌面背景下测试,检查截图边角是否与窗口边缘对齐。
  • 性能优化:对于频繁截图场景,缓存窗口句柄和dpi值以减少重复计算。

通过上述方法,可彻底解决窗口截图的位置偏差问题。如仍遇异常,建议使用pygetwindow库辅助验证窗口坐标,或通过pywin32getwindowplacement进一步调试窗口状态。

到此这篇关于python使用mss获取窗口图片的方法的文章就介绍到这了,更多相关python mss获取窗口图片内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com