前言¶
在 DeepSeek Harness(DSH)里做桌面侧智能体时,经常需要把「当前屏幕长什么样、某个窗口里是什么」交给模型。普通全屏截图只能拍到最上层像素:前台在播视频,后面的 IDE 或终端就进不了图。下面介绍的 dsh-screenshoot(维护者 machine202502,GitHub machine202502/dsh-screenshoot)面向 DSH 提供显示器、区域和窗口采集工具,窗口侧按窗口自身像素渲染,被遮挡、在后台或未聚焦时仍可出图。插件归类为客户端能力,与 DSH「一切皆插件」的扩展方式一致;社区目录页在 skillhub.cn,与 DeepSeek / 幻方无官方从属关系。
这是什么¶
dsh-screenshoot 是跨平台屏幕与窗口采集插件,支持 Windows、macOS、Linux(X11)。它在 Harness 中注册一组 screen_* 工具:列显示器、列可见窗口、截整屏/区域/指定窗口,结果保存为 PNG 并返回路径;可与 DSH 的 read_image 配合查看。版本 0.1.0,MIT 许可证,要求 Node.js >= 20。插件本身不拉 npm 依赖,运行时依赖各平台系统工具(见下文「平台与依赖」)。
核心工具与行为¶
README 中列出的工具如下。
| 工具 | 作用 |
|---|---|
screen_monitors |
列出显示器:位置、尺寸、缩放、是否主屏 |
screen_windows |
列出可见窗口:id、pid、标题、进程、位置、尺寸 |
screen_capture_monitor |
截取整块显示器 |
screen_capture_region |
截取矩形区域 |
screen_capture_window |
按 pid、title 或 id(十进制或 0x…)截取窗口 |
区域坐标相对虚拟桌面:若矩形超出屏幕,会按与可见区域的交集裁剪,结果说明里会出现 clamped;若无交集则返回带桌面尺寸信息的错误。
三种截图工具均支持 delayMs,最长等待 30 秒再拍,便于等菜单展开、动画结束或窗口重绘。
所有截图输出 PNG,返回结果中的路径可交给 read_image 打开。
窗口局部裁剪¶
窗口不必整窗截取,可在窗口左上角为原点指定矩形:
screen_capture_window { pid: 11184, crop: { x: 40, y: 60, width: 420, height: 240 } }
→ window 420×240 … · crop 420×240 at 40,60
坐标相对窗口内容左上角,不是屏幕坐标。裁剪框超出窗口图像时会报错并给出图像尺寸,不会静默裁到边缘。裁剪在插件内用 src/png.js 完成,不依赖 ImageMagick。
会话中的缩略图¶
与 Browser 类插件类似:截图后工具结果行会出现缩略图。宿主在 127.0.0.1:49231 起本地帧服务,工具返回 [shot:<id>] 标记,客户端据此渲染图片;内存中保留最近 24 帧,PNG 文件仍留在磁盘。点击缩略图可在新标签页打开原图。
各平台实现要点¶
Windows:PowerShell + Win32。用 EnumWindows、DwmGetWindowAttribute 列窗与边界;PrintWindow(PW_RENDERFULLCONTENT) 把窗口画进 bitmap(非屏幕拷贝),故可截被挡住的窗;Graphics.CopyFromScreen 负责显示器与区域;按显示器 DPI 感知,坐标与尺寸为物理像素。窗口标题经 base64 传递,stdout 强制 UTF-8,避免非 ASCII 标题乱码。
macOS:screencapture 与 JavaScript for Automation。NSScreen 列显示器;CGWindowListCopyWindowInfo 列窗口;screencapture -l <window id> 截窗(含被挡情况),-R 区域,-D 指定显示器。需在「系统设置 → 隐私与安全性」中授予 屏幕录制,否则 macOS 可能只返回壁纸。
Linux(X11):xrandr 列显示器,wmctrl -lGpx 列窗口与几何,import -window 从窗口缓冲取图,import -window root -crop 截区域。Wayland 下 X11 工具无法可靠枚举窗口;插件会说明缺失条件而非返回黑图。Wayland 上整屏/区域可参考 README 中的 grim、wlr-randr 说明,完整窗口采集需 portal/grim 等另行方案。
安装与启用¶
官方 README 给出的安装方式如下。
npx --yes github:machine202502/dsh-screenshoot
也可手动编辑 ~/.dsh/profiles/desktop/package.json,加入依赖并在 dsh.profile.bundles 中包含 dsh-screenshoot,然后重启 DSH:
{
"dependencies": { "dsh-screenshoot": "github:machine202502/dsh-screenshoot" },
"dsh": { "profile": { "bundles": ["…", "dsh-screenshoot"] } }
}
安装前建议浏览仓库源码与 MIT 许可证;插件以当前 DSH 进程权限运行,能访问的窗口与屏幕范围与该用户会话一致。
典型用法¶
下列示例来自 README,可在 Harness 对话中由智能体调用对应工具。
screen_monitors
→ 0* 3200x2000 at 0,0
screen_windows { title: "Brave" }
→ 132518 pid 9800 3200x1904 at 0,0 machine202502/dsh-browser – Brave
screen_capture_window { title: "Brave" }
→ 路径指向 PNG 3200x1904(窗口曾在 DSH 后面)
screen_capture_region { x: 100, y: 100, width: 800, height: 500 }
screen_capture_monitor { monitor: 0 }
仓库内可用以下命令自检后端与工具链(需在克隆或安装后的插件目录执行,此处仅作资料记录):
node tests/probe.mjs # 直接探测平台后端
node tests/smoke.mjs # 经 index.js 走工具
适用场景与注意¶
适合需要在 DSH 桌面配置里做 UI 排查、文档截图、对照前台干扰下后台窗口内容的场景。Linux 用户若在 Wayland 会话,应预期窗口列表与 X11 窗口截图为受限或不可用,按插件报错信息准备 X11 会话或 Wayland 替代工具。
| 平台 | 依赖 |
|---|---|
| Windows | PowerShell 5.1+(系统自带)、.NET Framework |
| macOS | 屏幕录制权限 |
| Linux X11 | xrandr、wmctrl、ImageMagick(import) |
| Linux Wayland | grim、wlr-randr(README 注明 mainly 显示器/区域) |
结尾¶
dsh-screenshoot 把显示器枚举、区域截图和「按窗口像素」截图收进 DSH 工具集,并支持延迟拍摄、窗口 crop 与会话内缩略图预览。进一步了解可访问目录页 https://www.skillhub.cn/plugins/machine202502/dsh-screenshoot 与仓库 https://github.com/machine202502/dsh-screenshoot。