跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Python 基于 DXGI 实现现代游戏窗口无闪烁截图方案

Python 利用 DXGI Desktop Duplication API 解决 DirectX 11/12 游戏窗口后台截图黑屏或无效问题。通过 ctypes 调用原生 DLL 绕过 GDI,直接获取 GPU 显存数据并转换为 NumPy 数组,支持高帧率捕获与 OpenCV 处理,适用于自动化脚本及 AI 训练场景。

奇形怪状发布于 2026/3/27更新于 2026/6/212 浏览

Python 基于 DXGI 实现现代游戏窗口无闪烁截图方案

在 Windows 平台上,很多现代游戏(尤其是使用 DirectX 11/12 或 Vulkan 渲染的游戏)会启用硬件加速和独占全屏模式。传统的截图方法往往无法捕获这些窗口的内容,结果要么是黑屏,要么是桌面背景。

这是因为游戏画面直接由 GPU 渲染到显存,不经过 GDI;操作系统出于性能和安全考虑,限制了普通程序对受保护窗口的访问。

那么,有没有一种能在后台稳定、高效、无闪烁地截取游戏窗口的方法?答案是:有!使用 DXGI(DirectX Graphics Infrastructure)技术。

解决方案:基于 DXGI 的 Python 封装类

我们开发了一个轻量级 Python 类 DxgiCapture,它通过调用一个原生 C++ 编写的 DLL(dxgi4py.dll),利用 Windows 的 DXGI Desktop Duplication API 实现对任意窗口(包括全屏/无边框游戏)的高速截图。

核心优势
  • 支持 DX11 / DX12 游戏(如《原神》《CS2》《永劫无间》《艾尔登法环》等)
  • 无需前台激活窗口,真正后台运行
  • 帧率高、延迟低,适合自动化脚本、AI 训练、直播监控等场景
  • 返回 NumPy 数组,无缝对接 OpenCV / PyTorch / TensorFlow

核心代码

import ctypes
from ctypes import *
import numpy as np
import win32gui
import cv2
from pathlib import Path

root = Path(__file__).parent

class DxgiCapture:
    def __init__(self):
        self.dxgi = None
        self.__hwnd = None
        self.user32 = ctypes.windll.user32
        self.user32.SetProcessDPIAware()
        self.user32.SetProcessDpiAwarenessContext()

    @property
    def hwnd(self):
        return self.__hwnd

    @hwnd.setter
    def hwnd(self, hwnd):
          hwnd  .hwnd == hwnd:
            
        .__hwnd = hwnd
        .dxgi = .create_dxgi(hwnd)

     ():
        .dxgi.destroy()

     ():
        .hwnd = hwnd
        shotLeft, shotTop, width, height = .getWindowRect()
        shot = np.ndarray((height, width, ), dtype=np.uint8)
        shotPointer = shot.ctypes.data_as(POINTER(c_ubyte))
        buffer = .dxgi.grab(shotPointer, shotLeft, shotTop, width, height)
        image = np.ctypeslib.as_array(buffer, shape=(height, width, ))
        image = cv2.cvtColor(image, cv2.COLOR_BGRA2RGB)
         image

     ():
        left, top, right, bottom = win32gui.GetWindowRect(.hwnd)
        shotLeft, shotTop = , 
        height = bottom - top
        width = right - left
         shotLeft, shotTop, width, height

     ():
         (, , ):
            .dxgi.destroy()
        dxgi = ctypes.CDLL((root / ))
        dxgi.grab.argtypes = (POINTER(ctypes.c_ubyte), ctypes.c_int, c_int, c_int, c_int,)
        dxgi.grab.restype = POINTER(c_ubyte)
        dxgi.init_dxgi(hwnd)
         dxgi
if
not
or
self
return
self
self
self
def
__del__
self
self
def
__call__
self, hwnd
self
self
4
self
4
return
def
getWindowRect
self
self
0
0
return
def
create_dxgi
self, hwnd
if
getattr
self
"dxgi"
None
self
str
"dxgi4py.dll"
return

调用实例

import win32gui
from dxgi_capture import DxgiCapture

# 获取目标窗口句柄(例如:查找'原神'窗口)
hwnd = win32gui.FindWindow(None, "原神")

# 初始化截图器
capture = DxgiCapture()
capture.hwnd = hwnd

# 单次截图
frame = capture(hwnd)
# 返回 RGB 格式的 numpy.ndarray (H, W, 3)
# 可直接用于 OpenCV 显示或模型推理
import cv2
cv2.imshow("Game Capture", frame)
cv2.waitKey(0)

⚠️ 注意:首次使用需安装 pywin32 和 opencv-python:

pip install pywin32 opencv-python numpy

技术原理简述

我们的 dxgi4py.dll 封装了以下关键步骤:

  1. 通过 IDXGIFactory1 枚举显卡适配器;
  2. 创建 IDXGIOutputDuplication 对象,绑定到目标窗口所在的显示器;
  3. 使用 AcquireNextFrame 获取 GPU 帧缓冲区;
  4. 将显存数据拷贝到 CPU 内存,并转换为 BGRA 格式;
  5. 通过 ctypes 指针传递给 Python,构建 NumPy 数组。

整个过程绕过 GDI,直接与 DirectX 交互,因此能捕获受保护内容。

常见问题(FAQ)

Q:是否支持 Vulkan 游戏? A:部分支持。Vulkan 内容若通过 DXGI 共享(如 Steam Overlay 开启),可被捕获;否则需额外层(如 OBS 的 Vulkan 钩子)。

Q:能否截取 UWP 应用(如 Xbox Game Bar)? A:受限于 Windows 安全策略,部分 UWP 应用无法捕获。

Q:是否需要管理员权限? A:不需要!普通用户权限即可运行。

结语

如果你正在开发游戏辅助工具、AI 自动化脚本、直播监控系统,这套基于 DXGI 的截图方案将极大提升你的效率与稳定性。

目录

  1. Python 基于 DXGI 实现现代游戏窗口无闪烁截图方案
  2. 解决方案:基于 DXGI 的 Python 封装类
  3. 核心优势
  4. 核心代码
  5. 调用实例
  6. 获取目标窗口句柄(例如:查找“原神”窗口)
  7. 初始化截图器
  8. 单次截图
  9. 返回 RGB 格式的 numpy.ndarray (H, W, 3)
  10. 可直接用于 OpenCV 显示或模型推理
  11. 技术原理简述
  12. 常见问题(FAQ)
  13. 结语
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于 Microi 吾码低代码框架构建 Vue 高效应用
  • OpenClaw 对接飞书实现多机器人群聊配置
  • 基于 FastAPI 自动构建 SSE MCP 服务器
  • Cute_Animal_For_Kids_Qwen_Image 儿童专属 AI 绘画工具使用指南
  • Flutter 三方库 eth_sig_util 鸿蒙适配及以太坊签名技术指南
  • Sora2 API 调用实践及开源前端接入示例
  • AI 驱动的图表生成器 Next-AI-Draw.io 部署指南
  • 2024年AI大模型时代C端应用生态变局与产业创新价值分析
  • 在 macOS 下升级 Python 的几种常见方法
  • 错误定位 Prompt:快速定位异常堆栈
  • 鸿蒙金融理财全栈项目:风险控制、合规审计与产品创新
  • 网络安全入门:价值观、方法论与职业发展指南
  • GitHub 学生认证与 PyCharm 配置 Copilot 全流程指南
  • 矿场轨道异物AI监测系统:构建矿山运输安全智能防线
  • Java String 类常用方法详解
  • C++ 类与对象进阶特性与编译器优化实战
  • Fun-ASR 在中文普通话任务准确率超越 Whisper-small 近 5 个百分点
  • Python 字典子类的设计与实现
  • AI 驱动的小程序开发:从零构建“打工了马”实战复盘
  • 使用 WiX Toolset 构建专业 Windows 安装包:Whisper 部署实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online