如何使用Python同时捕获指定的多个Windows窗口截图?
Python捕获多个指定窗口的截图方案
完全可以实现同时捕获多个指定窗口的截图,下面是针对Windows平台的实用方案(主流PC场景):
核心依赖库
使用pywin32获取窗口句柄与信息,结合Pillow处理图像,安装命令:
pip install pywin32 pillow
实现步骤与代码
1. 根据窗口标题获取句柄
通过窗口标题精准或模糊匹配目标窗口,拿到窗口的句柄(HWND)。
2. 获取窗口的位置与尺寸
通过句柄获取窗口客户区的左上角坐标、宽度和高度,确定截图区域。
3. 捕获窗口截图
调用Windows API的PrintWindow方法,即使窗口被遮挡也能捕获其内容(这是比pyscreenshot更灵活的核心优势)。
完整代码示例:
import win32gui import win32ui import win32con from PIL import Image def capture_window_by_title(window_title): # 模糊匹配窗口,需精准匹配可改用win32gui.FindWindow(类名, 标题) hwnd = win32gui.FindWindow(None, window_title) if not hwnd: print(f"未找到标题为{window_title}的窗口") return None # 获取窗口客户区的位置和大小 left, top, right, bottom = win32gui.GetClientRect(hwnd) width = right - left height = bottom - top # 初始化设备上下文与位图对象 hwnd_dc = win32gui.GetWindowDC(hwnd) mfc_dc = win32ui.CreateDCFromHandle(hwnd_dc) save_dc = mfc_dc.CreateCompatibleDC() save_bitmap = win32ui.CreateBitmap() save_bitmap.CreateCompatibleBitmap(mfc_dc, width, height) save_dc.SelectObject(save_bitmap) # 执行窗口捕获 capture_result = win32gui.PrintWindow(hwnd, save_dc.GetSafeHdc(), 0) # 将位图转换为PIL图像 bmp_info = save_bitmap.GetInfo() bmp_data = save_bitmap.GetBitmapBits(True) img = Image.frombuffer( 'RGB', (bmp_info['bmWidth'], bmp_info['bmHeight']), bmp_data, 'raw', 'BGRX', 0, 1 ) # 释放资源 win32gui.DeleteObject(save_bitmap.GetHandle()) save_dc.DeleteDC() mfc_dc.DeleteDC() win32gui.ReleaseDC(hwnd, hwnd_dc) return img if capture_result == 0 else None # 示例:批量捕获指定窗口 target_titles = ["记事本", "Google Chrome"] for title in target_titles: screenshot = capture_window_by_title(title) if screenshot: screenshot.save(f"{title}_screenshot.png") print(f"{title}截图已保存")
补充说明
- 若存在同标题窗口,
FindWindow会返回第一个匹配项,可改用win32gui.EnumWindows遍历所有窗口,结合进程ID、窗口类名等信息精准筛选目标。 - 针对DirectX渲染的游戏、视频窗口,
PrintWindow可能失效,这类场景可改用mss库直接截取屏幕对应区域,但需确保窗口未被遮挡。 - 运行代码时需保证有足够系统权限,避免因权限限制无法访问窗口内容。
内容的提问来源于stack exchange,提问作者user19807726
相关产品推荐
相关产品推荐

