在windows系统下,python可通过以下方法实现窗口截图,具体方案取决于需求精度和场景:
1. 使用pil库截取全屏或指定区域
from pil import imagegrab
# 截取整个屏幕
screenshot = imagegrab.grab()
screenshot.save("full_screen.png")
# 截取指定区域(左上角坐标+宽高)
crop_area = (100, 100, 500, 400) # left, top, right, bottom
cropped = imagegrab.grab(bbox=crop_area)
cropped.save("partial_screen.png")
2. 结合win32gui精准截取指定窗口
需先安装pywin32库:
pip install pywin32
代码示例:
import win32gui
from pil import imagegrab
# 获取窗口句柄
hwnd = win32gui.findwindow(none, "记事本") # 窗口标题
# 获取窗口位置和尺寸
left, top, right, bot = win32gui.getwindowrect(hwnd)
width = right - left
height = bot - top
# 截取窗口区域
img = imagegrab.grab(bbox=(left, top, right, bot))
img.save("window_screenshot.png")
3. 使用mss库(跨平台高性能)
安装:
pip install mss
代码示例:
import mss
with mss.mss() as sct:
# 截取指定显示器编号的屏幕
monitor = sct.monitors[1]
sct_img = sct.grab(monitor)
mss.tools.to_png(sct_img.rgb, sct_img.size, output="mss_screenshot.png")
4. 截取隐藏窗口(需配合win32api)
对于非最小化窗口,可通过win32gui获取窗口dc后截图:
import win32gui
import win32ui
import win32con
from pil import image
hwnd = win32gui.findwindow(none, "计算器")
# 创建设备上下文
hdc = win32gui.getdc(hwnd)
mdc = win32gui.createcompatibledc(hdc)
# 获取窗口尺寸
left, top, right, bot = win32gui.getwindowrect(hwnd)
w, h = right - left, bot - top
# 创建位图
bitmap = win32ui.createbitmap()
bitmap.createcompatiblebitmap(hdc, w, h)
win32gui.selectobject(mdc, bitmap.gethandle())
# 复制屏幕区域
win32gui.bitblt(mdc, 0, 0, w, h, hdc, 0, 0, win32con.srccopy)
# 保存为图片
bmp_info = bitmap.getinfo()
bmp_str = bitmap.getbitmapbits(true)
pil_img = image.frombuffer(
'rgb',
(bmp_info['bmwidth'], bmp_info['bmheight']),
bmp_str,
'raw',
'bgrx',
0,
1
)
pil_img.save("hidden_window.png")
# 释放资源
win32gui.deleteobject(bitmap.gethandle())
win32gui.deletedc(mdc)
win32gui.releasedc(hwnd, hdc)
关键注意事项:
- 窗口标题匹配:
findwindow需精确匹配窗口标题,可通过spy++工具获取实际标题 - 权限问题:部分窗口截图需要管理员权限
- 性能对比:
- pil:简单快速,适合简单场景
- mss:跨平台,支持多显示器,性能优异
- win32api:精准控制,可处理隐藏窗口
- dpi缩放:高dpi屏幕需额外处理缩放比例,可通过
ctypes获取系统缩放系数调整坐标
根据具体需求选择方案,常规截图推荐使用pil或mss,精准控制推荐win32api方案。
到此这篇关于python根据windows窗口截图的几种实现方法的文章就介绍到这了,更多相关python根据windows窗口截图内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论