Python实现窗口截图的三种高效方法:win32gui、pyautogui与PyQt对比

叶初
叶初
发布时间:2026-10-15| 4人浏览过
原创

本文详解Python实现窗口截图的三种主流方案。首先介绍基于win32gui和Pillow的精准窗口截取法,支持指定窗口名称与坐标;其次分析pyautogui方案,具备快速响应(约0.04s)及区域自定义优势,但无法指定特定程序窗口;最后探讨PyQt5方案,可精准定位特定窗口句柄,但无法自定义截图区域。文中包含完整代码实现、性能对比及优缺点分析,助开发者选择最佳截屏策略。

基于win32gui的精准窗口截图实现

实现该功能的核心思路是首先获取当前处于激活状态的最顶层窗口信息,并从中提取出窗口的标题名称。

随后,系统需获取该窗口的几何坐标数据,具体包括左上角的起始坐标以及右下角的结束坐标。完成坐标定位后,直接执行截图指令并将生成的图像进行预览展示。

此方案依赖两个第三方库:win32gui用于Windows窗口操作,Pillow用于图像处理。安装这两个模块的命令如下:

pip install Pillow
pip install win32gui

在代码中,需要将上述三个非标准库导入到当前脚本环境中。

from win32gui import *  # 操作windows窗口
from PIL import ImageGrab  # 操作图像
import win32con  # 系统操作

初始化一个set类型的集合用于存储所有活动窗口的名称。选用set数据结构的主要目的是利用其特性确保所有获取到的窗口名称具有唯一性,避免重复。

names = set()

接下来编写get_window_title函数,该函数的作用是遍历并获取当前系统中所有的活动窗口对象。

def get_window_title(window, nouse):
    '''
    获取窗口标题函数
    :param window: 窗口对象
    :param nouse:
    :return:
    '''

    if IsWindow(window) and IsWindowEnabled(window) and IsWindowVisible(window):

        names.add(GetWindowText(window))

EnumWindows(get_window_title, 0)

list_ = [name for name in names if name]

for n in list_:

    print('活动窗口: ', n)

用户输入想要进行截图的目标窗口名称,程序据此从所有活动窗口中筛选并提取出对应的窗口对象。

name = input('请输入需要截图的活动窗口名称: \n')

window = FindWindow(0, name)  # 根据窗口名称获取窗口对象

ShowWindow(window, win32con.SW_MAXIMIZE)  # 将该窗口最大化

获取该目标窗口的具体坐标信息,包括起始坐标和结束坐标,以便后续进行精确截取。

x_start, y_start, x_end, y_end = GetWindowRect(window)

# 坐标信息
box = (x_start, y_start, x_end, y_end)

调用ImageGrab.grab()函数,传入之前获取的坐标区域,从而实现对指定窗口的截图操作。

image = ImageGrab.grab(box)

截图完成后,调用相关代码展示截图效果。如果用户不需要在本地预览图片,可以注释或删除这行代码。

image.show()  # 图片展示,如果截完图需要展示则放开此项

最后一步操作是将截取好的图片保存至本地文件系统中。

image.save('target.png')

print('截图已经保存完成!')

至此,整个基于win32gui的Python窗口截图操作流程即告完成。

补充内容

除了上述方法,Python生态中还有多种其他方式可以实现窗口截图功能。

pyautogui截屏方案:速度与区域自定义

方法一:使用pyautogui库实现截屏

import pyautogui
import cv2
import numpy as np

img = pyautogui.screenshot(region=[300,50, 200, 100])  # 分别代表:左上角坐标,宽高
#对获取的图片转换成二维矩阵形式,后再将RGB转成BGR
#因为imshow,默认通道顺序是BGR,而pyautogui默认是RGB所以要转换一下,不然会有点问题
img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

cv2.imshow("截屏",img)
cv2.waitKey(0)

该方法的优点包括:

  • 代码编写简便快捷,核心截屏逻辑仅需一行代码。
  • 执行速度极快,耗时约0.04秒,基本能够满足实时截屏的需求。
  • 支持用户自由定义截图的具体区域范围。

该方法的缺点包括:

无法指定获取特定应用程序的窗口,因此如果目标窗口被其他窗口遮挡,则无法正确截取。

PyQt5截屏方案:特定窗口定位与显示

方法二:使用PyQt5库实现截屏

a. 获取目标窗口的句柄,即通过窗口标题(title)定位窗口。

import win32gui

hwnd_title = dict() #创建字典保存窗口的句柄与名称映射关系


def get_all_hwnd(hwnd, mouse):
    if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):
        hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)})

win32gui.EnumWindows(get_all_hwnd, 0)

for h, t in hwnd_title.items():
    if t!= "":
        print(h, t)

注意:程序会打印出所有窗口的hwnd(句柄)和title(标题),获取到正确的title后即可进行后续截图操作。

b. 使用PyQt5库执行截屏的核心代码逻辑。

from PyQt5.QtWidgets import QApplication
import win32gui
import sys
#这个是截取全屏的
hwnd = win32gui.FindWindow(None, 'C:/Windows/system32/cmd.exe')
app = QApplication(sys.argv)
screen = QApplication.primaryScreen()
img = screen.grabWindow(hwnd).toImage()
img.save("screenshot.jpg")

注意:若需截取特定窗口,只需将代码中的'C:/Windows/system32/cmd.exe'替换为上一步打印出的对应title,并确保该窗口未被最小化。

该方法的优点包括:

代码编写简便快捷,核心截屏逻辑仅需一行代码。

执行速度极快,耗时约0.04秒,基本能够满足实时截屏的需求。

支持用户自由指定要截取的特定窗口。

该方法的缺点包括:

不支持自由定义截图的具体区域范围,通常截取整个窗口。

c. 使用PyQt5截屏并通过Matplotlib格式显示的核心代码。

def convertQImageToMat(incomingImage):
    '''  Converts a QImage into an opencv MAT format  '''
    # Format_RGB32 = 4,存入格式为B,G,R,A 对应 0,1,2,3
    # RGB32图像每个像素用32比特位表示,占4个字节,
    # R,G,B分量分别用8个bit表示,存储顺序为B,G,R,最后8个字节保留
    incomingImage = incomingImage.convertToFormat(4)
    width = incomingImage.width()
    height = incomingImage.height()

    ptr = incomingImage.bits()
    ptr.setsize(incomingImage.byteCount())
    arr = np.array(ptr).reshape(height, width, 4)  # Copies the data
    # arr为BGRA,4通道图片
    return arr

from PyQt5.QtWidgets import QApplication
import win32gui
import sys
import cv2
import numpy as np
hwnd = win32gui.FindWindow(None, '剑士之魂中文版小游戏,在线玩,4399小游戏 - 360安全浏览器 13.1')
app = QApplication(sys.argv)
screen = QApplication.primaryScreen()
img = screen.grabWindow(hwnd).toImage()

img=convertQImageToMat(img)#将获取的图像从QImage转换为RBG格式
cv2.imshow("asd",img)      #imshow
cv2.waitKey(0)

至此,关于Python实现超快窗口截图功能的详解介绍完毕。如需了解更多Python窗口截图相关内容,请搜索本站历史文章或继续浏览后续文章,感谢大家的支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。