🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

录屏截图 Link-h1j/dsh-screen-capture-record-desktop

DeepSeek Harness
Link-h1j34 天前有提交已提供中文文档扫描:含敏感能力

录一段或截一张,把界面问题直接发给模型

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/1 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Link-h1j/dsh-screen-capture-record-desktop
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · vision
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 34 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/1) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 62 处,展示前 31 条)
  • 读取本地文件
    lib/index.js:127
    if (win && existsSync(win)) return win
  • 执行外部命令来自配置/变量
    lib/index.js:159
    ps = spawn(pickPowerShell(), args, { windowsHide: true })
  • 执行外部命令来自配置/变量
    lib/index.js:215
    ps = spawn(pickPowerShell(), args, { windowsHide: true })
  • 读取本地文件
    lib/index.js:270
    if (!existsSync(WINDOW_SCRIPT)) {
  • 执行外部命令来自配置/变量
    lib/index.js:277
    ps = spawn(pickPowerShell(), psArgs, { windowsHide: true })
  • 读取本地文件
    lib/index.js:435
    if (!existsSync(target)) {
  • 读取本地文件
    lib/index.js:441
    isDir = statSync(target).isDirectory()
  • 执行外部命令固定命令
    lib/index.js:452
    const child = spawn('explorer.exe', args, { detached: true, stdio: 'ignore', windowsHide: true })
  • 读取本地文件
    lib/index.js:545
    if (!existsSync(SOURCES_SCRIPT)) {
  • 读取本地文件
    lib/index.js:613
    if (!existsSync(SHOT_SCRIPT)) {
  • 删除本地文件递归
    lib/index.js:674
    if (dir) rm(dir, { recursive: true, force: true }).catch(() => {})
  • 写入本地文件
    lib/index.js:774
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    lib/index.js:776
    await writeFile(file, body)
  • 执行外部命令来自配置/变量
    lib/index.js:801
    const r = spawnSync(cmd, args, { timeout: 8000, windowsHide: true, encoding: 'utf8' })
  • 执行外部命令固定命令
    lib/index.js:890
    const r = spawnSync('reg', ['query', 'HKCU\\Environment', '/v', name], {
  • 写入本地文件
    lib/index.js:1066
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    lib/index.js:1069
    out = createWriteStream(file)
  • 发起网络请求
    lib/client.js:953
    const res = await fetch(SHOT_ROUTE + '?probe=1&ts=' + Date.now(), { cache: 'no-store' })
  • 发起网络请求
    lib/client.js:985
    res = await fetch(SHOT_ROUTE + '?' + q.join('&'), { cache: 'no-store' })
  • 发起网络请求
    lib/client.js:1889
    const res = await fetch(
  • 写入剪贴板
    lib/client.js:1906
    if (navigator.clipboard && navigator.clipboard.writeText) await navigator.clipboard.writeText(text)
  • 发起网络请求
    lib/client.js:1930
    const res = await fetch(REVEAL_ROUTE + '?path=' + encodeURIComponent(path) + '&ts=' + Date.now(), {
  • 发起网络请求
    lib/client.js:2024
    res = await fetch(SOURCES_ROUTE + '?ts=' + Date.now(), { cache: 'no-store' })
  • 发起网络请求
    lib/client.js:2604
    res = await fetch(REC_START + q, { method: 'POST', cache: 'no-store' })
  • 发起网络请求
    lib/client.body.js:942
    const res = await fetch(SHOT_ROUTE + '?probe=1&ts=' + Date.now(), { cache: 'no-store' })
  • 发起网络请求
    lib/client.body.js:974
    res = await fetch(SHOT_ROUTE + '?' + q.join('&'), { cache: 'no-store' })
  • 发起网络请求
    lib/client.body.js:1878
    const res = await fetch(
  • 写入剪贴板
    lib/client.body.js:1895
    if (navigator.clipboard && navigator.clipboard.writeText) await navigator.clipboard.writeText(text)
  • 发起网络请求
    lib/client.body.js:1919
    const res = await fetch(REVEAL_ROUTE + '?path=' + encodeURIComponent(path) + '&ts=' + Date.now(), {
  • 发起网络请求
    lib/client.body.js:2013
    res = await fetch(SOURCES_ROUTE + '?ts=' + Date.now(), { cache: 'no-store' })
  • 发起网络请求
    lib/client.body.js:2593
    res = await fetch(REC_START + q, { method: 'POST', cache: 'no-store' })
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 输入框内录屏
  • 输入框内截图
  • 生成视频图片证据

给 DSH 桌面版输入框加「录屏」「截图」两个按钮:把「说不清」的界面问题变成能直接发给模型的视频 / 图片证据,减少人机沟通的来回损耗。欢迎官方收录进桌面版本体。截图与录屏证据,让人与智能体沟通更顺畅。

README

由 DeepSeek 最新模型翻译生成
dsh-screen-capture-record-desktop 给 DSH 桌面版(Desktop)输入框工具条加两个按钮:在「听写 / 开始录音」左边插入「录屏」和「截图」。 为什么做这个 人和模型沟通时,最贵的一步往往不是模型不够聪明,而是我们描述不准:按钮错位了、动效不对、点完某个开关界面变成了另一副样子……打字描述要花几分钟,还常常漏掉决定性细节,来回几轮才说清一件事。 这个插件就是把这一步压缩成两个动作 —— 录一段、截一张,直接塞进输入框: - 录屏产出一个 .webm 视频(不是一堆图片),抽不抽帧、抽多密由会话里的智能体按需决定; - 截图带选区,框哪算哪; - 两者都走 DSH 现成的附件通道,在输入框里补一句话就能发出去。 模型拿到的是第一手画面,而不是一段转述。少一轮误解,就少一次返工 —— 这是它唯一的设计目标。
展开完整文档(README 剩余 1 节)
dsh-screen-capture-record-desktop

给 DSH 桌面版(Desktop)输入框工具条加两个按钮:在「听写 / 开始录音」左边插入「录屏」和「截图」。

为什么做这个

人和模型沟通时,最贵的一步往往不是模型不够聪明,而是我们描述不准:按钮错位了、动效不对、点完某个开关界面变成了另一副样子……打字描述要花几分钟,还常常漏掉决定性细节,来回几轮才说清一件事。

这个插件就是把这一步压缩成两个动作 —— 录一段、截一张,直接塞进输入框:

- 录屏产出一个 .webm 视频(不是一堆图片),抽不抽帧、抽多密由会话里的智能体按需决定;
- 截图带选区,框哪算哪;
- 两者都走 DSH 现成的附件通道,在输入框里补一句话就能发出去。

模型拿到的是第一手画面,而不是一段转述。少一轮误解,就少一次返工 —— 这是它唯一的设计目标。

Quick start (English). A DSH Desktop plugin that adds two buttons to the left of the dictation button in the composer toolbar. Record: click to start, click again (or press Esc) to stop — the host process captures frames and encodes them into a single .webm video that is attached to your message. Screenshot: capture the full screen, drag a region in the picker, and attach the crop. It exists to make human-agent communication cheaper: instead of describing a UI problem in words, hand the model the actual picture. Requires Windows with PowerShell 5.1+, Python 3 with Pillow, and an ffmpeg build that includes the image2pipe demuxer, the mjpeg decoder, the libvpx_vp8 encoder and the webm muxer — see 前置条件. Install with dsh plugin add dsh-screen-capture-record-desktop, then fully restart DSH.

两个按钮

| 按钮 | 图标 | 操作 | 产物 |
| 录屏 | 显示器 + 录制圆点 | 点一下开始(按钮右上角出现红色计时徽标);再点一下结束;录制中按 Esc 也可结束;到达最长时长会自动结束 | 一个 .webm 视频(VP8),自动塞进输入框附件 |
| 截图 | 相机 | 点一下抓整屏 → 弹出选区浮层 → 确认后进附件 | 一张 JPEG,自动塞进输入框附件 |

两个按钮的悬浮提示常态只有两个字(「录屏」/「截图」),录制中显示「停止录屏」;只有宿主路由没挂上时才补一句原因。

快捷键与选区浮层

| 场景 | 按键 / 操作 | 含义 |
| 录屏中 | Esc | 停止录屏 |
| 选区浮层 | 按住左键拖动 | 框选一块区域 |
| 选区浮层 | 单击(不拖动) | 选中整屏 |
| 选区浮层 | Enter 或「用这张」 | 确认当前选区 |
| 选区浮层 | Esc、右键、点遮罩空白处、或「取消」 | 取消截图 |

选区浮层会在页面里按 92% × 80% 的视口比例缩放展示整屏底图,框选后再按原始分辨率裁切,所以框出来的图不会因为展示缩放而变糊。

安装

从 registry 安装(推荐)

dsh plugin add dsh-screen-capture-record-desktop

装完必须完整重启 DSH(宿主侧的抓屏 / 录屏路由在进程启动时挂载,只刷新界面不会生效)。

本地开发 / 免发布安装

dsh plugin --profile desktop add link:<插件目录绝对路径>

link: 是给本地开发用的:直接把包目录链进配置档,改完 lib/ 立即被加载,不必先发布到 registry。同样需要完整重启 DSH。

⚠ 同一个插件不要在两层同时挂载。已经用上面的方式安装后,就不要再手工往配置档的 cordis.patch.yml 里写同 id 的 insert 行 —— 两层挂同一个 id 会导致重复挂载。启停、卸载请在 DSH 的「插件」页里做。

本插件是一个组合包(bundle):package.json 声明了 dsh.bundle.patch,由 cordis.patch.yml 把自己那一行插进配置档的插件名单;浏览器半边由 package.json 的 dsh.client 声明加载。

前置条件

这是本插件最大的使用门槛:截图只需要 Windows + PowerShell;录屏还需要 Python 和 ffmpeg。

| 能力 | 要求 | 说明 |
| 运行平台 | Windows | 宿主侧用 PowerShell + GDI 抓屏,目前只支持 Windows |
| 抓屏 | PowerShell 5.1 及以上 | Windows 自带的 powershell.exe 即可,也可以指向 pwsh.exe |
| 录屏 | Python 3 + Pillow | 抓帧用 Pillow 的 ImageGrab;缺 Pillow 时录屏起不来。安装:pip install Pillow |
| 录屏 | ffmpeg(必须是带这些组件构建的) | 见下方清单 |

录屏用的 ffmpeg 必须编译进了这几段:

| 组件 | 用途 |
| image2pipe(demuxer) | 从管道读连续的 MJPEG 帧 |
| mjpeg(decoder) | 解码每一帧 |
| libvpx_vp8(encoder) | 编码成 VP8 |
| webm(muxer) | 封装成 .webm |
Playwright 自带的那份精简 ffmpeg 就够用(它恰好开了这一段),不必单独装系统版 ffmpeg。可以这样自查:

ffmpeg -hide_banner -demuxers | findstr /i image2pipe
ffmpeg -hide_banner -decoders | findstr /i mjpeg
ffmpeg -hide_banner -encoders | findstr /i libvpx
ffmpeg -hide_banner -muxers | findstr /i webm

四条都出现在输出里,才说明这份 ffmpeg 能用于录屏。

怎么把路径指给插件

宿主进程启动时读这几个环境变量:

| 环境变量 | 指向 | 不设置时的查找顺序 |
| DSH_CAPTURE_PYTHON | 带 Pillow 的 python.exe | 插件所在工作区里的虚拟环境 / 自带 CPython → 系统 PATH 上的 python.exe |
| DSH_CAPTURE_FFMPEG | 上面那份 ffmpeg.exe | 工作区或 %LOCALAPPDATA% 下的 ms-playwright\ffmpeg-* → 系统 PATH 上的 ffmpeg.exe |
| DSH_CAPTURE_POWERSHELL | 抓屏用的 PowerShell | %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe → PATH 上的 powershell.exe |

设置之后要完整重启 DSH(这些变量在宿主进程启动时读取)。截图不依赖 Python / ffmpeg,所以缺了它们按钮仍然可用,只是录屏会报错。

配置

客户端(localStorage)

在 DevTools 控制台改,下一次操作立即生效,不需要重启:

localStorage['dsh-capture.fps'] = '5'
localStorage['dsh-capture.picker'] = '1'
localStorage['dsh-capture.maxDimension'] = '1280'
localStorage['dsh-capture.quality'] = '0.72'
localStorage['dsh-capture.maxSeconds'] = '180'

| 键 | 默认值 | 取值范围 | 含义 |
| dsh-capture.fps | 5 | 1 – 15 | 录屏帧率 |
| dsh-capture.maxDimension | 1280 | 640 – 2560 | 录屏单帧长边上限(像素) |
| dsh-capture.quality | 0.72 | 0.3 – 0.95 | 帧 / 截图的 JPEG 质量 |
| dsh-capture.picker | 1(开) | 0 / false 关闭,其余视为开 | 截图是否弹出选区浮层;0 = 直接抓整屏进附件 |
| dsh-capture.maxSeconds | 180 | 5 – 900 | 录屏最长秒数,到点自动结束 |

参数越界会被夹到合法范围或退回默认值,不会报错。截图时客户端会自动把质量抬高 0.1(上限 0.92),并用不小于 1920 的长边上限裁剪,保证框选出来的图够清晰。

宿主侧(环境变量)

| 环境变量 | 默认值 | 含义 |
| DSH_CAPTURE_PYTHON | 自动探测 | 录屏抓帧用的 Python |
| DSH_CAPTURE_FFMPEG | 自动探测 | 录屏编码用的 ffmpeg |
| DSH_CAPTURE_POWERSHELL | 系统 Windows PowerShell | 截图抓屏用的 PowerShell |
| DSH_CAPTURE_DIR | <DSH_HOME>\dsh-screen-capture | 截图 / 录像的落盘根目录 |
| DSH_CAPTURE_TIMEOUT_MS | 15000 | 单次抓屏超时(毫秒) |
| DSH_HOME | %USERPROFILE%\.dsh | DSH 家目录,决定默认落盘位置 |

宿主侧变量改完必须完整重启 DSH。

产物落盘位置

默认落在 <DSH_HOME>\dsh-screen-capture(DSH_HOME 默认 %USERPROFILE%\.dsh),可用 DSH_CAPTURE_DIR 覆盖。时间戳格式为 YYYYMMDD-HHMMSS。

| 产物 | 路径 |
| 截图 | <DSH_HOME>\dsh-screen-capture\shot-<时间戳>\shot-<时间戳>.jpg |
| 录像 | <DSH_HOME>\dsh-screen-capture\rec-<时间戳>.webm |

截图会先落盘、再进附件,所以即使附件入口出问题,磁盘上也一定有文件(提示条会给出目录,并自动把路径复制到剪贴板)。录像同样是宿主直接写盘,附件里那份是从磁盘原样取回的。

故障排查

先看宿主日志,前缀是 [dsh-screen-capture]。

| 现象 | 可能原因 | 处理 |
| 点「录屏」提示「起录屏失败」,日志说找不到 python | 没装 Python 3,或解释器里没有 Pillow | python -c "import PIL" 自查;pip install Pillow;或用 DSH_CAPTURE_PYTHON 指向带 Pillow 的解释器 |
| 录屏能开始,结束时提示「没录到内容(ffmpeg 没写出文件)」 | 这份 ffmpeg 缺 libvpx_vp8 或 webm | 用「前置条件」里的四条自查命令确认;换一份带这些组件的 ffmpeg,用 DSH_CAPTURE_FFMPEG 指过去 |
| 录屏一开始就报 Error opening input: Protocol not found | 该 ffmpeg 不认 -i - | 插件已统一用 -i pipe:0;仍报这个说明 ffmpeg 版本过老或构建异常,换一份 |
| 附件里有图 / 有视频,但没看到提示条 | 自绘提示条被更高层级的浮层盖住,或没渲染出来 | 以附件卡片和磁盘文件为准;在 DevTools 里查 [data-dsh-capture-toast] 是否在 DOM 中及其层级 |
| 提示条显示「宿主路由没挂上(…):完整重启桌面版后再生效」 | 宿主进程没加载到新路由:装完或更新后没完整重启,或插件未启用 | 完整重启 DSH;在「插件」页确认插件已启用、没有被回滚 |
| 点「截图」直接就是整屏,没有框选 | dsh-capture.picker 被设成了 0;或在浮层里只是单击(单击 = 整屏,设计如此);或框得太小(小于 4px 会回退成整屏) | 把 dsh-capture.picker 设回 1,用拖动框选 |
| 截图黑屏 / 有黑边 / 内容错位 | 多显示器:抓的是整个虚拟桌面的联合矩形,显示器排列带负坐标或各自缩放不同时会留下黑边;DPI:抓屏进程若没声明 DPI 感知会得到缩放模糊图 | 确认显示器的虚拟桌面矩形;DSH_CAPTURE_POWERSHELL 指向真正的 powershell.exe(插件会主动声明 DPI 感知) |
| 录出来的画面没有鼠标指针 | 光标当时不在虚拟桌面范围内 | 默认会把光标画进每一帧;把鼠标移回捕获范围即可 |
| 视频录好了,但提示「取回失败」 | 浏览器那一侧没拿到视频字节 | 视频仍在磁盘上(提示里带完整路径),可以直接拖进输入框 |
| 工具条上根本没出现这两个按钮 | 找不到「听写」按钮这个锚点(宿主界面或语言变化),或插件未启用 | 看按钮悬浮提示和控制台里的 [dsh-capture] 日志;完整重启 DSH |
| 录像太大 / 太长 | 帧率、分辨率或时长上限偏高 | 调低 dsh-capture.fps、dsh-capture.maxDimension、dsh-capture.maxSeconds |

实现方式(一句话)

桌面壳在浏览器侧禁用了屏幕共享,所以抓屏 / 录屏全部放在宿主进程做,浏览器半边只负责按钮、选区浮层、把产物塞进附件。宿主侧的录制管道是「Python 抓帧 → MJPEG → ffmpeg → 单个 .webm」,产物是完整视频而不是一堆抽好的图片(要不要抽帧、抽多密,由使用方按需决定)。

欢迎官方收录

这个插件刻意只站在官方公开接口上实现:组合包用 package.json 的 dsh.bundle.patch 声明,浏览器半边用 dsh.client 挂载,宿主侧只用 ctx.inject(['webServer']) 注册路由 —— 不改 DSH 源码、不碰私有 API、不引入第三方运行时。按钮尺寸、圆角、图标规范、悬浮提示、轻提示、选区卡片也都逐项对齐了官方组件(实测数据见 DEV.md),目的就是让它看起来、用起来都像内置功能。

如果官方认为「把说不清的界面问题直接发给模型」这件事该由桌面版本体来做,欢迎直接收录、合并,或以任何方式复用这里的实现 —— 本仓库是 MIT,随你处置。需要配合改造、补测试或写设计说明,在本仓库开 Issue 即可,作者会跟到底。

License

MIT。以 package.json 的 license 字段和仓库根目录的 LICENSE 文件为准。
预览分享卡片长什么样 ↓Link-h1j/dsh-screen-capture-record-desktop
分享 · DeepSeek Harness Hub
Link-h1j/dsh-screen-capture-record-desktop

录一段或截一张,把界面问题直接发给模型

这是你的仓库?认领条目

回到顶部