dsh-screenshot
在对话输入框的 + 菜单里加一行 截图提问:点一下就能在整个桌面上选窗口或框选区域(DSH 窗口不隐藏、不最小化),然后在同一个窗口里像微信截图那样加标注(矩形、椭圆、直线、箭头、画笔、马赛克、文字),最后 插入对话 / 复制 / 另存为。
使用
- 打开输入框的
+,点 截图提问(在「命令」分组末尾,位于「导出」之后)。 - 桌面被「冻结」成一张覆盖全部显示器的截图,DSH 就在这张图里,保持原样。此时:
- 鼠标所在窗口被保留、其余区域整片压暗,并给该窗口描一圈绿色边框(微信同款);
- 左键单击:把高亮的整个窗口作为选区;
- 按住左键拖动:自己框选——拖动过程中选区实时保持高亮、选区之外同步压暗,选区上沿跟着显示宽 x 高像素尺寸,松开即确定;
- 右键 / Esc:取消。 - 选区确定后同一个窗口直接变成标注界面:选区四边与四角各有控制点,可继续拉伸/裁剪;不选工具时在选区内按住可整体移动选区。
| 工具 | 说明 |
|---|---|
| 矩形 / 椭圆 | 按住左键拖出图形 |
| 直线 | 从按下点画到松开点 |
| 箭头 | 按下点是箭尾、松开点是箭尖,任意方向都成立 |
| 画笔 | 自由手绘线条 |
| 马赛克 | 拖出矩形,该区域被像素化 |
| 文字 | 在画面上点一下就地输入,Enter 确认,Esc 放弃 |
工具条是一整排白色圆角底、右对齐选区:矩形 椭圆 直线 箭头 画笔 马赛克 文字 | 撤销 重做 | 复制 另存为 | ✕ 取消 ✓ 插入;当前工具浅蓝底、蓝色图标。
- 颜色 / 大小默认不显示:点过 矩形 / 椭圆 / 直线 / 箭头 / 文字 之后(或选中这类图形时)才在工具条下方浮出第二排。画笔与图形用粗细(2 / 4 / 8 px);文字用字号,标成「小 / 中 / 大」(18 / 28 / 44 px);改色、改大小直接作用在选中的对象上。
- 画完还能改:图形画完即处于选中状态(蓝色虚线框 + 控制点);拖控制点改大小,直线/箭头拖端点改长度方向,图形内拖动平移,
Delete删除,再点一次工具按钮继续画下一个。 - 撤销 / 重做:
Ctrl+Z/Ctrl+Y(或Ctrl+Shift+Z),按钮在没有可执行内容时置灰。Ctrl+A整屏为选区。 - ✓ 插入对话:标注后的图片作为附件进入当前输入框,可继续写字一起发送。
- 复制:整张标注图进剪贴板。另存为:PNG / JPEG / BMP。
- ✕ 取消:放弃本次截图;
Esc依次是「取消选中 → 退出当前工具 → 退出选区 → 取消截图」。
4. 图片进入输入框后与手动粘贴的图片走同一条通道,附件数量/体积上限、发送中拒绝等规则都由 composer 判断。
实现
- Host 半(
index.js):注册POST /screenshot/v6/capture(要求x-dsh-screenshot: 1且同源)与GET /screenshot/v6/status。PowerShell 只负责三件事:声明 per-monitor DPI 感知、把整个虚拟屏幕抓成full.png、编译并运行editor.cs;最终以 base64 data URL 把标注后的图返回页面。 - 编辑器(
editor.cs):随包发布的 C# 5 源码,抓图时用Add-Type现场编译。一个无边框、置顶、覆盖所有显示器的 WinForms 窗口同时承担「选」和「标」:EnumWindows+DwmGetWindowAttribute(DWMWA_EXTENDED_FRAME_BOUNDS)找光标下窗口、拖动中实时重算选区并压暗其外、GDI+ 手绘图标与工具条、Compose()按原始分辨率合成输出。 - 启动方式:由 Host 直接
spawnPowerShell 并等待结束(-STA必需)。explorer/wscript之类的绕行链路会把窗口开到不可见桌面上,不要改成那种方式。 - Client 半(
client.js):注册+菜单的命令行(ctx.commandUi.register,名字screenshot),并在conversation.input.overlay上挂一个只在失败时出现的提示卡片(可重试)。拿到 PNG 后先尝试inputActions.addFiles,否则派发合成粘贴事件,交回 composer 的文档级粘贴入口。 - 排查用日志:
%TEMP%\dsh-screenshot.log(capture ok 宽x高 in 毫秒)与%TEMP%\dsh-screenshot-editor.log(hover、finish 动作)。
为什么不是「添加」分组里的一行
+ 菜单的分组由 @deepseek-ai/dsh-client-ui-commands 的 SECTION_ROWS 写死:只有 file / goal / plan / feedback 会进「添加」,其余一律排在「命令」分组末尾;插件贡献的命令名与内置命令重名会在注册时报错。所以这一行固定在「命令」分组最后。
平台
截屏与标注目前只在 Windows 上实现;其他平台 GET /screenshot/v6/status 返回 supported: false,浏览器页面(非桌面端)里这一行不出现。
卸载
在插件管理里移除 dsh-screenshot 即可;它只注册一个菜单命令、一个提示卡片插槽和两个 Host 路由。