Repository navigation
Releases
v0.6.3
0.6.3
修复
- 设了
DSH_CAPTURE_FFMPEG,录屏却还在用 Playwright 自带的那份 ffmpeg:setx与「用户级环境变量」只写注册表,而 DSH 从 explorer 启动时环境块在启动那一刻就固定了 —— 连重启 DSH 都带不上新值(本机实测:重启后宿主process.env.DSH_CAPTURE_FFMPEG仍为空)。
录屏侧(lib/index.js)现在先看进程内变量,没有就补读HKCU\Environment;抽帧工具tools/extract-frames.mjs用同一套兜底,两边吃到同一份 ffmpeg。 - 文档同步:README 的「不设置时的查找顺序」与环境变量说明、AGENTS.md 与抽帧工具注释里的探测顺序。
本机验收(2026-10-26)
进程内 DSH_CAPTURE_FFMPEG 为空、只在用户级注册表里设值:
record/start回执ffmpeg = ffmpeg.exe(注册表指向的 n9.0.2,不是 Playwright 的ffmpeg-win64.exe),record/stop产物 VP8 / WebM、魔数1a45dfa3合法;- 抽帧
--json的ffmpeg字段同样指向它; - 仓库自带闸门全绿:
build-client --check、selftest、smoke(真抓屏 + 合法 WebM)。
说明
- 探测结果仍按进程缓存:宿主已经录过一次屏之后再改环境变量,需要重启 DSH 或禁用再启用插件才会重新探测。
安装 / 更新
dsh plugin add dsh-screen-capture-record-desktop装完完整重启 DSH。npm 包:dsh-screen-capture-record-desktop@0.6.3(带 npm provenance 签名)。
v0.6.0 — 窗口列表可收起 + 截图隐藏DSH界面 + 提示条打开文件夹
本次按用户实测反馈做了两处调整,外加一个真机踩出来的坑:
- 「窗口(N 个)」这一节可以收起了 —— 收起的只是窗口列表(标题前 ▾/▸ 切换),屏幕 / 显示器那几行照旧;同时选择框整体缩小(卡片 384px 宽、缩略图 64×38);
- 截图新增「隐藏DSH界面」 —— 宿主先把 DSH 自己的窗口藏起来,抓一张不含 DSH 界面的整屏,立刻恢复(约 1 秒,连最大化状态一起还原);再点一下「显示DSH界面」换回带 DSH 的底图;
- 完成提示条里的磁盘路径能点开了 —— 提示条右侧新增「打开文件夹」,让宿主在资源管理器里定位产物(用户原话:「录完之后的黑框里面磁盘也不能点进去」)。
装它
dsh plugin add dsh-screen-capture-record-desktop装完必须完整重启 DSH(宿主侧的抓屏 / 选源 / 录屏 / 打开文件夹路由在进程启动时挂载,只刷新界面不会生效)。
验收(真浏览器 + 真宿主路由 + 真机,不是纸上推演)
| 验收 | 结果 |
|---|---|
| 真浏览器 + 真宿主路由 UI 断言 | 29/29 —— 窗口节收起只隐藏窗口行(屏幕行仍在、遮罩与卡片不变、收起状态记忆);隐藏DSH界面(hidden=1、底图换图、再点恢复);提示条「打开文件夹」渲染可点;无未捕获异常 |
宿主 handleShot 直调 |
10/10 —— hidden=1 / restored=1 / 合法 JPEG / 抓完窗口可见 / 最大化状态还原 |
tools/smoke.mjs |
全过 —— 9 条路由接线 + /reveal 的 200 dryRun / 403 目录外 / 404 不存在 |
| 真机窗口藏/显 | 10+ 次均能恢复可见与最大化;本轮没有新的崩溃日志 |
0.6.0 — 录屏选源框
变更
- 「窗口(N 个)」一节可折叠:点标题收起 / 展开窗口列表(▾/▸),屏幕 / 显示器那几行保持不变;收起状态在同一页面里记住。收起的是窗口列表,不是把整个选择框收起来。
- UI 按「够用就好」缩了一档:卡片 680 → 384px 宽、最大高度 84vh → 72vh、缩略图 104×60 → 64×38、标题 15 → 13px,行高与内边距同步收紧。
0.6.0 — 截图:隐藏 DSH 界面
- 浮层工具栏新增「隐藏DSH界面」开关:宿主跑
lib/window.ps1把 DSH 自己的顶层窗口藏起来 → 抓一张不含 DSH 的整屏 → 立刻恢复(约 1 秒,连最大化状态一起还原);再点一下「显示DSH界面」换回带 DSH 的正常截图。两种底图都能继续框选 / 标注 /「用这张」。 - 新路由
GET /shot?...&hideDsh=1(响应头x-dsh-capture-hidden/x-dsh-capture-restored如实报告「藏没藏成」「窗口恢复没有」)与只读的GET /window(窗口清单,诊断用)。 - 新脚本
lib/window.ps1(Win32,纯 ASCII):按父进程 pid 枚举 DSH 的顶层窗口,藏 / 显并记录、还原原来的最大化 / 最小化状态。
0.6.0 — 提示条:打开文件夹
- 录屏 / 截图完成提示条右侧新增「打开文件夹」动作:文件 = 在资源管理器里选中它,目录 = 直接打开。
- 新路由
GET /reveal?path=<绝对路径>[&dryRun=1]:只允许打开截图/录像落盘根目录内的路径,防止变成「打开任意文件 / 程序」的后门;dryRun只校验不真调起(自测用)。老宿主(路由未挂载)上点击退化为「复制路径 + 说明原因」,不静默失败。 toast()支持第四个参数{label,onClick}:动作元素自己pointer-events:auto(父级 none 时子元素设 auto 仍可命中),不破坏官方 Toast「不挡页面」的特性。
修复
- 宿主用
windowsHide起 PowerShell 时,ShowWindow(SW_SHOW)会静默失败(对别的进程窗口「返回成功但WS_VISIBLE不变」,窗口一直藏着且不报错;2026-10-20 真机复现):改用SW_SHOWNA显示 +SetForegroundWindow,显示后逐个核对IsWindowVisible;宿主端再核对一次并允许重试一轮,恢复失败会在界面里明确提示点托盘图标。 - 隐藏前记录、恢复时还原窗口的最大化 / 最小化状态(否则最大化窗口会被显示成普通大小)。
tools/smoke.mjs的路由数断言过期(原来只断言 5 条,漏了 sources / status),补成完整 9 条路由。
完整改动见 CHANGELOG.md;
本次提交 95527e7(10 个文件,+1749 / −143)。
v0.5.0 — 录屏先选「录哪一个」(屏幕 / 窗口 / 自定义区域)+ 截图选区与标注合并成一层
本次把两个版本一起发(0.4.0 之前只在本地,没单独打过 tag):
- 录屏前先选「录哪一个」 —— 整桌面 / 显示器 / 窗口(跟着窗口走)/ 自定义区域;
- 截图把选区与标注合并成一层 —— 拖完框选手一松就能画,全程只按一次「用这张」。
装它
dsh plugin add dsh-screen-capture-record-desktop装完必须完整重启 DSH(宿主侧的抓屏 / 选源 / 录屏路由在进程启动时挂载,只刷新界面不会生效)。
这次是真机验收过的,不是纸上推演
| 验收 | 结果 |
|---|---|
tools/check-live-record.mjs(真宿主,直接打路由,不需要 CDP) |
9/9 —— /sources 已挂载;真清单 3840×2160 + 4 窗口(中文标题正常);抓屏像素 == /sources 的 virtual(坐标系对齐硬证据);区域 1600×900 → 首帧 1280×720 精确;窗口 hwnd 录制尺寸对 |
tools/e2e-annotate.mjs(真机,CDP 合成事件) |
13/13(截图标注 + annotate=0 回归 + 取消不产物) |
tools/e2e-record-picker.mjs(mock 模式) |
8/8(选源框渲染 / URL 拼装含 hwnd / 取消不误开录) |
tools/check-capture-sources.mjs(宿主侧,不需要 DSH 在跑) |
8/8 |
| 用户侧闭环 | 插件自己录出的 .webm 经「选源 → 录制 → 停录 → 附件 → 发送」回到对话 |
0.5.0 — 录屏先选「录哪一个」
新增
-
录屏前先选「录哪一个」:点「录屏」不再直接开录,而是弹一个「选择要录制的内容」框 ——
选项 含义 整个桌面(所有显示器) 老行为,虚拟桌面全录 显示器 N 只录那一台显示器 窗口 只录那一个窗口(按句柄跟随:录的过程中窗口被拖动/改大小都跟着走) 自定义区域… 回到「拖框选」浮层,拖哪录哪 框里的每一项都带缩略图(一张整屏底图按各源矩形裁出来的小图,不是逐窗口抓),
上次选的那个会预选上并滚进视野。选中即开录,取消则什么都不做。为什么需要它:桌面版把
getDisplayMedia写死拒绝,所以拿不到 Chrome 那种原生
「分享内容」选择器;工作机是 3840×2160,整屏录完再缩到 1280 长边,字就糊了 ——
录之前就把范围收窄,画质和体积都省。 -
新路由
GET /sources(宿主lib/sources.ps1枚举显示器/窗口)+record/start
新增x/y/w/h(区域)与hwnd(窗口跟随)参数;recorder.py新增
--region/--hwnd:每帧按--hwnd的当前矩形裁剪(窗口最小化/失效时退回
--region的固定矩形),光标坐标按本帧原点平移。 -
dsh-capture.askSource开关(默认开):设0就跳过选择框,直接用上次选的那个。
说明与限制
- 录窗口录的是屏幕上那块像素,不是窗口自己的画面 —— 别的窗口摞在上面就会录到
摞上去的那个(宿主机只能抓屏,做不到getDisplayMedia那种窗口流)。所以录窗口时
别把别的窗口盖上去。 - 「窗口」列表按 z 序取可见、非最小化、面积 ≥ 120×80 的顶层窗口(最多 80 个),
已过滤 cloaked(UWP 幽灵窗)与 tool window。
0.4.0 — 截图:选区 + 标注合并成一层
变更(用户实测反馈)
-
拖完框选手一松就能用画笔:原来截图分成两层 —— 先选区浮层(拖框,再按
Enter/「用这张」
确认),确认后才另起一层标注浮层(只显示裁出来那块 + 工具栏)。用户的原话是
「截图功能能不能在刚刚拖动框选的时候就能使用画笔」,于是把两层合成一层:整屏铺开 → 拖框 → 松手即进入标注态(工具栏就位、画笔默认选中)→ 画完点一次「用这张」全程只确认一次;框歪了点「重选区域」回到选区态(笔画留着,按新框重新裁剪)。
单击不拖仍是「选中整屏」,留在选区态等你按Enter,不会因为误点直接进标注态。 -
标注工具栏改成跟随 DSH 主题的 design token(
--dsw-alias-*),和选区卡片同一套语言,
不再是「黑底 + 琥珀描边」。工具栏从卡片内挪到卡片下方,不再压住截图底部内容。 -
笔画只在选区内生效(画布按选区裁剪)—— 画到框外的部分不会偷偷进图,所见即所得。
新增
dsh-capture.annotate开关(默认开):设0退回老行为「拖框 + 用这张」,没有工具栏。
修复
tools/selftest.mjs的假 DOM 沙箱里没有fetch,apply()一进去就ReferenceError,
于是「插不出按钮」这种结论一直是假阳性(新旧版本都 FAIL)。现在给了fetch替身。
完整改动见 CHANGELOG.md;
本次提交 e2d8b8d(15 个文件,+3710 / −263)。



