Windows 窗口截图
使用本技能的 scripts/capture-window.ps1,通过 Win32 PrintWindow 将目标窗口自身绘制到 PNG。适用于 Windows 10/11 和 Windows PowerShell 5.1,无需额外依赖。默认包含窗口边框、标题栏;不同应用对 PrintWindow 的支持不同,不能承诺所有窗口都能取得有效内容。
执行
- 从用户请求确定目标。每次重新枚举窗口;进程的 MainWindowHandle 为 0 不代表窗口不存在,脚本使用 EnumWindows 查找当前可见顶层窗口。
- 有明确标题/进程时直接截图;目标不明确或多个匹配时,先用
-List列出候选,再按当前 PID/句柄缩小范围。无法从上下文判断时询问用户,不能自动选第一个窗口。 - 使用绝对 PNG 输出路径,将图片存入当前任务允许写入的目录。默认拒绝覆盖;只有用户要求覆盖时才传
-Overwrite。 - 执行完成后用图像查看工具实际打开输出,再把当前图片内嵌给用户。PrintWindow 返回 true 或文件存在不足以证明截图有效。
以下 <skill-dir> 替换成本 SKILL.md 所在目录;<absolute.png> 替换成实际绝对输出路径:
# 按标题包含匹配,大小写不敏感;不使用通配符。
powershell -NoProfile -ExecutionPolicy Bypass -File "<skill-dir>/scripts/capture-window.ps1" -Title "逍遥模拟器" -OutputPath "<absolute.png>"
# 先列出某进程的候选窗口,再按当前 PID 和完整标题截图。
powershell -NoProfile -ExecutionPolicy Bypass -File "<skill-dir>/scripts/capture-window.ps1" -ProcessName "MEmu" -List
powershell -NoProfile -ExecutionPolicy Bypass -File "<skill-dir>/scripts/capture-window.ps1" -ProcessId 21544 -Title "逍遥模拟器" -ExactTitle -OutputPath "<absolute.png>"
# 多个选择条件按 AND 组合;句柄应来自本次枚举。
powershell -NoProfile -ExecutionPolicy Bypass -File "<skill-dir>/scripts/capture-window.ps1" -WindowHandle 329382 -ProcessId 21544 -OutputPath "<absolute.png>"
脚本成功时返回 JSON,包含实际窗口身份、绝对图片路径和尺寸;-List 仅枚举,不截图。未找到目标、多目标、最小化、无效尺寸或截图失败均停止并说明原因。
保持窗口与任务边界
- 脚本不调用激活、置顶、移动、调整大小、恢复最小化或隐藏其他窗口的 API,不发送键鼠事件。截图授权不包含启动应用或操作设备。
- 若当前工具沙箱无法访问交互桌面,按工具自身权限机制申请同一截图动作;不能把沙箱内空枚举直接解释为应用关闭。
- 最小化窗口不会自动恢复;让用户显示窗口后再截。空白、黑屏、缺少实际内容时,报告图像无效;不静默改为整桌面截图、CopyFromScreen、ADB截图或界面操作。
- PrintWindow 是同步调用。设置合理的工具超时;若长时间不返回,终止本次截图辅助进程,不终止目标应用,不无限重试。
已验证范围与来源
2026-10-13 在 Windows 的逍遥模拟器可见主窗口实际取得有效图片;通用选择器扩展不代表浏览器、GPU绘制窗口或最小化窗口均已验证。
使用已验证的 PrintWindow(hwnd, hdc, 2) 参数。线程 DPI 上下文只在枚举/截图期间调整并恢复,资源在 finally 中释放。微软官方说明:PrintWindow、EnumWindows、GetWindowRect。