Windows11下Python后台运行时无法对游戏窗口截图的问题求助
解决Windows后台运行时Python无法截图游戏窗口的问题
核心原因
Windows 11中,后台程序默认无法捕获前台独占窗口(尤其是游戏常用的DirectX/OpenGL全屏模式)的画面,这是系统的会话隔离和权限限制导致的,与截图库本身无关。
可行解决方案
1. 以管理员权限运行脚本
右键点击终端、PyCharm等运行环境,选择「以管理员身份运行」,可解除多数后台截图的权限限制。
2. 改用PrintWindow API捕获目标窗口
之前的win32ui代码依赖桌面DC,后台时无法获取前台窗口内容,改用PrintWindow直接捕获目标窗口画面:
import win32gui import win32ui from PIL import Image import time def capture_game_window(window_title): hwnd_target = win32gui.FindWindow(None, window_title) if not hwnd_target: raise Exception(f"未找到窗口:{window_title}") left, top, right, bot = win32gui.GetWindowRect(hwnd_target) w, h = right - left, bot - top # 获取目标窗口的DC,而非桌面DC hwnd_dc = win32gui.GetWindowDC(hwnd_target) mfc_dc = win32ui.CreateDCFromHandle(hwnd_dc) save_dc = mfc_dc.CreateCompatibleDC() save_bitmap = win32ui.CreateBitmap() save_bitmap.CreateCompatibleBitmap(mfc_dc, w, h) save_dc.SelectObject(save_bitmap) # 关键:用PrintWindow捕获后台窗口画面 win32gui.PrintWindow(hwnd_target, save_dc.GetSafeHdc(), 0) # 转换为PIL图像 bmp_info = save_bitmap.GetInfo() bmp_str = save_bitmap.GetBitmapBits(True) img = Image.frombuffer( 'RGB', (bmp_info['bmWidth'], bmp_info['bmHeight']), bmp_str, 'raw', 'BGRX', 0, 1) # 释放资源 win32gui.DeleteObject(save_bitmap.GetHandle()) save_dc.DeleteDC() mfc_dc.DeleteDC() win32gui.ReleaseDC(hwnd_target, hwnd_dc) return img # 循环截图测试 while True: try: img = capture_game_window('Backpack Battles') img.save('screenshot.png') except Exception as e: print(e) time.sleep(1.0)
3. 关闭游戏的全屏独占模式
进入游戏设置,将「全屏」改为「窗口化全屏」或「窗口模式」,系统不会对这类窗口做严格隔离,后台程序更容易捕获画面。
4. 调整程序的高DPI缩放设置
右键点击Python.exe或脚本快捷方式 → 属性 → 兼容性 → 更改高DPI设置 → 勾选「替代高DPI缩放行为」,下拉选择「应用程序」,可解决因DPI缩放导致的截图失败问题。
补充说明
ImageGrab、mss默认捕获当前会话的前台画面,后台时系统会限制这类调用,优先使用针对单个窗口的PrintWindow方案。- 禁用终端快速编辑模式仅解决终端卡顿问题,与后台截图权限无关。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

