dsh-wechat-shot
DSH 聊天输入框左侧的微信式区域截图按钮:冻结桌面 → 框选 → 确认后直接作为图片附件进入当前草稿,同时复制到剪贴板。
Windows only. 依赖 Windows PowerShell 5.1、WinForms 和运行时 C# 编译;macOS / Linux 不可用。
覆盖微信截图的核心链路(默认保留当前窗口,剪刀右侧箭头可选“隐藏窗口截图”、拖动时实时显示选框、8 手柄缩放、整块拖动、放大镜、仅“取消/完成”两个大按钮、Enter 确认、Esc/右键取消、Alt+A 唤起、剪刀图标);标注工具已按要求移除。OCR、滚动截长图、贴图置顶等扩展能力未实现。

安装
npm 发布版(推荐):
dsh plugin add dsh-wechat-shot
也可以在 DSH 的「插件」面板里搜索 dsh-wechat-shot。只支持 Windows。
交互
| 操作 | 行为 |
|---|---|
点击输入框左侧剪刀按钮 / Alt+A |
保留当前 DSH 窗口,打开全屏冻结遮罩(默认,和微信“保留当前窗口”一致) |
| 点击剪刀右侧箭头 → “隐藏窗口截图” | 先隐藏当前 DSH 窗口,再打开冻结遮罩 |
| 按住左键拖动 | 实时显示选框和尺寸(最小 10×10),松开后才出现工具栏 |
| 拖动选区内部 | 移动选区 |
| 拖动 8 个手柄 | 缩放选区(最小 20×20) |
工具栏“完成”大按钮 / 双击选区 / Enter / Ctrl+C |
确认:写 PNG、复制到剪贴板、回传 Host |
工具栏“取消”大按钮 / Esc / 右键 |
取消,不产生附件 |
Ctrl+A |
全屏选区 |
方向键 / Shift+方向键 |
选区移动 1 px / 10 px |
确认后客户端把 PNG 变成 File,走 conversation.createDrafts(sessionId, [file]) → inputActions.addAttachments(ids) 落入当前草稿;输入框拒绝时用 releaseDraftAttachments 回滚。
结构
| 文件 | 作用 |
|---|---|
package.json |
bundle 清单:dsh.bundle.patch + dsh.client(web / immediately / inject ui-conversation) |
cordis.patch.yml |
- insert: 一条 wechat-shot 插件行 |
index.js |
Host:注册 POST /api/wechat-shot/capture,执行 assets/capture.ps1,读回 PNG 字节 |
client.js |
浏览器:conversation.input.left 剪刀按钮、Alt+A、右侧“截图选项”菜单(隐藏窗口截图)、fetch、草稿附件、失败回滚与提示 |
assets/capture.ps1 |
薄启动器:编译/缓存 Overlay.cs,输出单行 JSON |
assets/Overlay.cs |
WinForms 遮罩:冻结帧、选区几何、放大镜、确认/取消工具条、剪贴板、PNG |
locale/{zh,en}.json |
插件面板的 meta.title / meta.description |
icon.svg |
插件图标 |
路由契约
POST /api/wechat-shot/capture (requestBody: buffered, 超时 300 s)
body {"hideWindow":true} 可选;省略/false 表示保留当前窗口
200 image/png 确认的选区
200 {"ok":false,"cancelled":true} Esc / 右键取消
405 / 500 {"ok":false,"error":"…","code":"…"}
- 暂存目录:
%TEMP%\dsh-wechat-shot\,保留最新 20 张 PNG。 - C# 编译缓存:
%TEMP%\dsh-wechat-shot-build\overlay-<sha256 前 16 位>.dll;缓存缺失或源码变更时重编。 capture.ps1用 UTF-8 显式读Overlay.cs,自身保持纯 ASCII;stdout 用 UTF-8 字节写单行 JSON,避免 PowerShell 5.1 重定向的代码页乱码。
安装
要求 Windows 10/11、DSH Desktop(web profile)和 Windows PowerShell 5.1。
从 npm 安装:
dsh plugin --profile desktop add dsh-wechat-shot
本地开发时,在支持 plugin_manager 的会话中:
plugin_manager install_bundle target = C:\Users\40529\Documents\deepseek-harness\default-workspace\wechat-shot
安装结果以返回的 application / warnings 为准;新 bundle 可以由 HMR 激活。装完刷新页面,输入框左侧应出现剪刀按钮。不要手写 profile 的 package.json / cordis.patch.yml。
卸载:plugin_manager remove_bundle,target 为包名 dsh-wechat-shot 或安装标识。
验证
已实测:
Add-Type编译通过;capture.ps1 -SelfTest→{"ok":true,"checks":22,"fails":[]},含工具栏只剩两个按钮、按钮尺寸与 Bake 缩放坐标断言。capture.ps1 -Preview生成 900×560 场景图,目检 8 手柄、两个大号“取消/完成”圆钮与提示字号(见docs/preview.png)。- GUI 按钮已渲染为剪刀图标,UI Automation 节点为
框选截图(dsws-btn);Invoke 后真实启动capture.ps1遮罩。 - “隐藏窗口截图”选项与默认路径分开验证(走真实客户端/路由,插件重载后):默认点剪刀,Host 子进程参数为
-HidePid -1,遮罩打开时 DSH 顶层窗口IsWindowVisible=true;点右侧“截图选项”→“隐藏窗口截图”,子进程参数为-HidePid <Host PID>,遮罩打开时 DSHIsWindowVisible=false;取消后恢复可见并聚焦。capture.ps1 -HidePid -1与-HidePid <pid>也分别直跑验证过;0保留为“隐藏当前前台窗口”的兜底。 - 拖动过程中实时显示绿色选框和尺寸角标,不显示手柄/工具栏;松开后才出现 8 手柄和工具栏(遮罩快照目检)。
- 工具条界面按系统 DPI 放大(本机 200%,按钮 96×96 物理像素、图标 34 px 半径),提示文字从 14 px 提到 30 px 物理像素;真实鼠标点“完成”得到 400×300 且
copied:true,点“取消”得到cancelled:true。 - 真实鼠标驱动(
SetCursorPos+mouse_event,DPI-aware):物理(300,200)→(700,500)拖选,Esc→ cancelled;再拖 400×300 后按Enter→ PNG 400×300、copied:true,内容与同一坐标的参考裁剪一致(鼠标悬停高亮会带来极小差异)。 - 注意:不要用
PostMessage(WM_MOUSEMOVE)验证坐标——注入点会被 WinForms 按 DPI 虚拟化,看起来像“半尺寸/漂移”,与真实鼠标行为不同(已踩过)。 - 确认后 PNG 已实际进入当前草稿(UIA 可见缩略图);测试附件随后全部移除。
node --check index.js client.js、package.json/locale JSON 解析、cordis.patch.yml经 js-yaml 真解析、capture.ps1纯 ASCII 无 BOM。- Host 用
execFile(..., { windowsHide: true })隐藏控制台;不能给powershell.exe传-WindowStyle Hidden,否则遮罩窗也被隐藏(已实测)。Host 仅在{"hideWindow":true}时把自身process.pid作为-HidePid传给启动器,默认传-1;0时启动器回退到“隐藏当前前台窗口”。Host 逻辑改动可通过禁用/再启用插件让 Host 重新加载(本次已这样验证),无需重启整个 DSH。
未实测/限制:
- 多显示器负坐标下的跨屏选择只做了部分实测;本机 200% DPI 已适配:form/冻结图/选区统一使用物理像素,真实鼠标坐标本身就是物理像素,不再乘 DPI 因子(乘了才会把 400×300 选框变成 800×600)。
Alt+A是页面内快捷键(按钮挂载且可见时生效),不是操作系统级全局热键。- 同一时刻只应有一个遮罩;Host 端未做并发互斥。
- 没有标注工具(按要求只保留确认/取消)、OCR、滚动截长图、贴图置顶。
静态检查
在工作区根目录:
node _probe\ss\check-bundle.mjs
node _probe\ss\check-yaml.mjs
powershell.exe -NoProfile -NonInteractive -STA -File wechat-shot\assets\capture.ps1 -SelfTest
-Preview <png> 可无交互渲染预览图。
归属
遮罩交互参考了两个 MIT 插件:dsh-screenshot-plugin(deepseekbluefish)的几何/手柄实现思路和 dsh-quick-screenshot(JackEngineer)的草稿附件链路;本包代码为重新实现,未逐行复制。
No comments yet. Be the first to write one.