- Accueil
- Plugins
- Améliorations UI
- dsh-screenshot
dsh-screenshot
sfunction-guo/dsh-screenshot
Snipping tool for the composer: freeze the screen, drag a region, annotate it, and drop the result into the message box. Windows only; the selector is a bundled WinForms binary (rebuilt from the included C# source if missing) and uses the built-in .NET Framework 4.x.
Installer
dsh plugin --profile web add github:sfunction-guo/dsh-screenshotREADME
dsh-screenshot
微信群截图式的标注工具,给 DeepSeek Harness 的输入框加一个「截图」按钮: 冻结屏幕 → 拖框选区 → 就地标注 → 一键进输入框(或只存文件)。
A WeChat-style screen snip and annotate button for the DSH composer. Windows only.
当前版本
0.1.0,一个人用了一阵子、有 23 项自动化断言守着的个人工具。
1. 解决什么问题
在 DSH 里贴图说明问题,原本得这样走一遍:
系统截图 → 保存成文件 → 用别的工具画框画箭头 → 再上传
四步,中间两次落盘。这个插件把它压成一步:点按钮 → 拖框 → 画 → 完成,图片直接出现在输入框的附件区。
它解决的三件具体事:
- 不用离开应用——截图、标注、发出去全在 DSH 窗口内完成,不用切到画图工具
- 能标得清楚——框、箭头、画笔、文字、编号、马赛克,够说清"这里、这里、还有这里"
- 机密不外流——截图和标注全在本机,不经过任何服务器
2. 主要功能
截图
- 点输入框左侧的取景框按钮,整个桌面被冻结并压暗
- 按住左键拖出范围,框内实时变亮、框外保持压暗,角落显示像素尺寸
- 松手即确认;
Esc取消
标注
工具条分两排:主排是工具与动作,点带展开的工具会在下方弹出第二排参数。
| 工具 | 第二排参数 | 说明 |
|---|---|---|
| 标注 | 矩形 / 椭圆 / 直线 / 箭头 | 拖出形状,线条圆头圆角 |
| 画笔 | 细 / 中 / 粗 + 橡皮擦 | 手绘曲线;橡皮按当前粗细擦除 |
| 文字 | 小 / 中 / 大 + 编号 | 点一下就地输入;编号是拖一下就落一个 ①②③ |
| 马赛克 | — | 拖出范围即模糊,用于遮挡账号、手机号、聊天记录 |
颜色 6 种:红、蓝、绿、黄、黑、白。
编辑已画的标注
- 点中文字或编号即选中(灰色虚线框 + 四角控制点)
- 拖框内移动,拖角点缩放字号
- 双击改文字内容,
Delete删除,Esc取消选中
输出
- ✓ 完成:图片进输入框附件区,可以继续打字一起发
- 保存:选路径存成 PNG,只落盘、不进输入框
- × 取消:丢掉这次截图
3. 安装方法
系统要求
- Windows 10 / 11
- .NET Framework 4.x(系统自带,无需单独安装)
方式一:插件市场(推荐)
DSH 的 设置 → 插件 → 发现 里搜索 dsh-screenshot,或等收录后从市场直接安装。
方式二:npm
npm install @sfunction/dsh-screenshot
它是一个 DSH bundle,package.json 里的 dsh.bundle.patch 声明了装载补丁。
方式三:本地目录(开发用)
把本仓库放进 DSH 的 profile,让插件管理器把该目录作为 bundle 安装即可。shot.exe 缺失时会自动用 select.cs 现场编译。
4. 使用方法
1. 在输入框左侧点「取景框」图标
2. 全屏变暗后,按住左键拖出要截的范围
3. 松手,工具条出现在选框下方
4. 选工具、选颜色,直接在图上画
5. 点 ✓ 完成(进输入框)或「保存」(只存文件)
快捷键
| 键 | 作用 |
|---|---|
Esc | 有选中标注时先取消选中;有选区时清空标注回到框选;都没有时退出截图 |
Enter | 完成并插入输入框 |
Delete | 删除当前选中的文字/编号 |
撤销请用工具条上的「撤销」按钮(没有绑定 Ctrl+Z)。
几个容易踩的点
- 马赛克永远在最底层:它只糊截图内容,不会盖住你画的任何标注
- 橡皮是"擦回截图":光标下的一切标注都会被恢复,不只是画笔笔画
- 重选:清空当前所有标注,回到重新拖框的状态
- 保存之后会话就结束了,不会再把图塞进输入框
5. 输入输出示例
示例一:指出界面上的问题
| 输入 | 拖选 1200×700 的一块界面,用红框框住按钮、红箭头指向它、加一行文字"这里点不动" |
| 输出 | 输入框附件区出现一张 1200×700 的 PNG,标注已烘焙进去 |
示例二:遮挡敏感信息
| 输入 | 截一段聊天记录,对昵称和手机号各拖一块马赛克 |
| 输出 | 对应区域变成模糊色块,原始文字不可读;其余内容保持不变 |
示例三:只存档不发送
| 输入 | 截图 → 标注 → 点「保存」→ 选 %USERPROFILE%\shots\bug.png |
| 输出 | 文件写到该路径,截图窗口关闭、输入框保持空白 |
示例四:画完再补一句
| 输入 | 截图 → 画两个红框 → 点 ✓ → 在输入框键入"这两个字段顺序反了" |
| 输出 | 一条带图片附件和文字的消息 |
6. 退出码(脚本化时用)
| 码 | 含义 | 页面行为 |
|---|---|---|
| 0 | 完成,已写出 PNG | 粘贴进输入框 |
| 2 | 用户取消 | 什么都不做 |
| 3 | 写文件失败 | 不做 |
| 4 | 只保存到磁盘(纯导出) | 什么都不做 |
7. 构建与自检
pwsh -File .\build.ps1
编译 select.cs → 生成 shot.exe → 跑 23 项断言。等价的单条编译命令:
& 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe' /nologo /target:winexe /optimize `
/out:.\shot.exe /r:System.Windows.Forms.dll /r:System.Drawing.dll .\select.cs
自检在没有窗口、没有鼠标的合成画布上跑,直接比对像素:
Start-Process .\shot.exe -ArgumentList @('x','--selftest','.\report.txt') -Wait -PassThru
winexe必须用Start-Process -Wait,PowerShell 不会等待它,也不设$LASTEXITCODE。退出码 0 = 全过。
其它模式:
shot.exe out.png --auto 400 300 --demo # 渲染一张包含全部标注的样图
shot.exe x --ui out.png --flyout pen # 渲染工具栏(pen / text / shapes)
8. 维护者说明:画布模型
改任何绘制相关代码前先读这一节。
screen 截图,永不修改
│
├─ canvas = screen 的拷贝,所有标注都画在它上面
│ ├─ 第一遍:马赛克(只读 screen 做模糊)
│ └─ 第二遍:画笔 / 形状 / 文字 / 编号
│
└─ 导出 = 裁 canvas
三条不变量:
- 马赛克是底图处理,不是图层对象。它只模糊
screen的内容,永远在标注下面,任何标注都不会被它盖住——与创建顺序无关。 - 重放永远是两遍(
Replay()):先所有mosaic,再其余。这是上面那条不变量的唯一实现点,改动它等于改变整个语义。 - 橡皮擦是"恢复截图",不是"擦成透明":它把
screen的像素按圆形笔迹贴回canvas。
为什么这么设计
- 早期用透明图层叠在截图上,
DrawString的字形边缘会和透明黑混合,文字出现暗色描边(阴影)。改成不透明画布后消失。 - 马赛克早期取样"当前画布",会把先画的标注糊进去、或在重画时抹掉它们。改成固定取样
screen后不再有这个问题。 - 局部重画(
LiftShape)遇到模糊区必须走完整重建:模糊区不能局部重绘,否则同一片区域上的其他标注会被抹掉。
自检覆盖了什么
23 项断言覆盖模型层:画布初始一致、文字落笔/抬升/移动、画笔、橡皮恢复、马赛克的不透明性与颜色不漂移、模糊层与标注的层级(双向)、圈号、重建、导出尺寸与逐像素一致。
9. 已知边界
- 鼠标层行为没有自动化:按钮命中、双击进入编辑、拖拽阈值、选框残影只能人工验。自检覆盖的是模型层(
Stamp/LiftShape/Replay/导出)。 - 橡皮擦会擦掉一切:光标下的矩形、文字、编号都会恢复成截图,不只是画笔笔画。这是当前语义。
- 马赛克盖不住标注:这是刻意设计的(见第 8 节),不是遗漏。
- DPI:只在 100% 缩放下验证过,更高缩放比未实测。
- 仅 Windows:
shot.exe是 WinForms 程序。
许可证
MIT,见 LICENSE。
Plugins associés
dsh-web (dsh-task-board)
zhu1090093659/dsh-web
dsh-web (dsh-web-all)
zhu1090093659/dsh-web
dsh-TUI
ccch1mneyyy/dsh-tui
dsh-web-ui (dsh-task-board)
zhu1090093659/dsh-web-ui