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

 更新时间:2025年10月15日 09:07:36   作者:detayun  
Python MSS(Multiple Screen Shots)是一款由BoboTiG开发的开源库,旨在提供高性能、纯Python编写的屏幕截图功能,本文给大家介绍了Python使用mss获取窗口图片的方法,需要的朋友可以参考下

您在使用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获取窗口图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • django使用LDAP验证的方法示例

    django使用LDAP验证的方法示例

    这篇文章主要介绍了django使用LDAP验证的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法

    多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法

    在本篇文章里小编给大家整理的是关于多版本python的pip 升级后, pip2 pip3 与python版本失配的解决方法内容,需要的朋友们学习下。
    2019-09-09
  • Python面向对象实现方法总结

    Python面向对象实现方法总结

    这篇文章主要介绍了Python面向对象实现方法总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Python Selenium中常用的元素定位方法总结

    Python Selenium中常用的元素定位方法总结

    在Web自动化测试中,元素定位是一项非常重要的技术,Python Selenium提供了各种元素定位方法,可以帮助我们定位页面上的元素并与之交互,本文将详细介绍Python Selenium中常用的元素定位方法,并提供实例代码,需要的朋友可以参考下
    2023-11-11
  • Python OpenCV实现视频追踪

    Python OpenCV实现视频追踪

    这篇文章主要为大家详细介绍了Python OpenCV实现视频追踪,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • django实现将后台model对象转换成json对象并传递给前端jquery

    django实现将后台model对象转换成json对象并传递给前端jquery

    这篇文章主要介绍了django实现将后台model对象转换成json对象并传递给前端jquery,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 使用Keras训练好的.h5模型来测试一个实例

    使用Keras训练好的.h5模型来测试一个实例

    这篇文章主要介绍了使用Keras训练好的.h5模型来测试一个实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Pytest中skip和skipif的具体使用方法

    Pytest中skip和skipif的具体使用方法

    在实际的测试中,我们经常会遇到需要跳过某些测试用例的情况,pytest提供了skip和ifskip来跳过测试.下面我们就来通过一些例子看看skip和ifskip具体如何使用吧,需要的朋友可以参考下
    2021-06-06
  • Python简单实现子网掩码转换的方法

    Python简单实现子网掩码转换的方法

    这篇文章主要介绍了Python简单实现子网掩码转换的方法,涉及Python字符串相关操作技巧,需要的朋友可以参考下
    2016-04-04
  • Conda虚拟环境的复制和迁移的四种方法实现

    Conda虚拟环境的复制和迁移的四种方法实现

    本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,直接复制envs目录,各方法适用于不同场景,需根据需求选择
    2025-06-06

最新评论