メインコンテンツへスキップ
S

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.

インストール

dsh plugin --profile web add github:sfunction-guo/dsh-screenshot

README

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

三条不变量:

  1. 马赛克是底图处理,不是图层对象。它只模糊 screen 的内容,永远在标注下面,任何标注都不会被它盖住——与创建顺序无关。
  2. 重放永远是两遍(Replay()):先所有 mosaic,再其余。这是上面那条不变量的唯一实现点,改动它等于改变整个语义。
  3. 橡皮擦是"恢复截图",不是"擦成透明":它把 screen 的像素按圆形笔迹贴回 canvas。

为什么这么设计

  • 早期用透明图层叠在截图上,DrawString 的字形边缘会和透明黑混合,文字出现暗色描边(阴影)。改成不透明画布后消失。
  • 马赛克早期取样"当前画布",会把先画的标注糊进去、或在重画时抹掉它们。改成固定取样 screen 后不再有这个问题。
  • 局部重画(LiftShape)遇到模糊区必须走完整重建:模糊区不能局部重绘,否则同一片区域上的其他标注会被抹掉。

自检覆盖了什么

23 项断言覆盖模型层:画布初始一致、文字落笔/抬升/移动、画笔、橡皮恢复、马赛克的不透明性与颜色不漂移、模糊层与标注的层级(双向)、圈号、重建、导出尺寸与逐像素一致。


9. 已知边界

  • 鼠标层行为没有自动化:按钮命中、双击进入编辑、拖拽阈值、选框残影只能人工验。自检覆盖的是模型层(Stamp/LiftShape/Replay/导出)。
  • 橡皮擦会擦掉一切:光标下的矩形、文字、编号都会恢复成截图,不只是画笔笔画。这是当前语义。
  • 马赛克盖不住标注:这是刻意设计的(见第 8 节),不是遗漏。
  • DPI:只在 100% 缩放下验证过,更高缩放比未实测。
  • 仅 Windows:shot.exe 是 WinForms 程序。

许可证

MIT,见 LICENSE。

関連プラグイン