Skip to content

Releases

v0.6.3

Choose a tag to compare

@Link-h1j Link-h1j released this 26 Oct 06:53

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界面 + 提示条打开文件夹

Choose a tag to compare

@Link-h1j Link-h1j released this 21 Oct 06:52

本次按用户实测反馈做了两处调整,外加一个真机踩出来的坑:

  • 「窗口(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+ 次均能恢复可见与最大化;本轮没有新的崩溃日志

录屏选源框:窗口(7 个)可收起
点标题收起:窗口列表隐藏,屏幕那几行还在
截图浮层点「隐藏DSH界面」后,底图变成被 DSH 挡住的内容
完成提示条右侧的「打开文件夹」


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 — 录屏先选「录哪一个」(屏幕 / 窗口 / 自定义区域)+ 截图选区与标注合并成一层

Choose a tag to compare

@Link-h1j Link-h1j released this 02 Oct 05:14

本次把两个版本一起发(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)。