前言¶
DSH Desktop 是一个基于 Electron 的应用。插件运行在独立的 Node 进程中,而系统托盘功能通常需要修改主进程代码。该插件通过代码注入的方式,为 DSH Desktop 提供了系统托盘支持,包括最小化到托盘、关闭时隐藏以及应用更新后的自愈恢复能力。
插件简介¶
dsh-desktop-tray 是一个为 DSH Desktop 提供系统托盘支持的客户端插件。它由 wodongx123 维护,许可证为 MIT。
安装与启用¶
通过 DSH Desktop 的插件市场安装,或在 web profile 中直接添加:
dsh plugin --profile web add github:wodongx123/dsh-desktop-tray
安装后需要重启 DSH Desktop(不是只重启 Harness)。首次启动时插件会自动进行注入。
核心功能¶
- 最小化到托盘:点击最小化按钮时隐藏到托盘,而不是任务栏。
- 关闭时隐藏:关闭窗口时保持后台运行(默认开启)。
- 立即隐藏:一键隐藏主窗口。
- 托盘交互:左键单击/双击显示主窗口,右键菜单显示主窗口或退出。
- 设置界面:设置 → 系统托盘(中英文双语)。
- 代码注入管理面板:从 0.2.0 起支持,可在设置页查看注入情况、开始/取消注入、确认编译效果。
工作原理¶
由于 DSH Desktop 是 Electron 应用,托盘只能在主进程创建,而插件运行在独立进程无法直接调用 Electron API。该插件采用“启动时自愈注入”机制:
- 应用启动时加载
tray-boot.js启动器。 - 启动器读取插件内的补丁定义,检查主进程文件(
out/main/index.js、out/preload/index.cjs)是否已注入。 - 未注入时,按锚点注入代码,并备份原文件为
*.dsh-tray.bak。 - 已注入时跳过(幂等操作)。
更新自愈:应用更新会覆盖 resources/app 目录,清除注入内容。插件本体安装在 AppData 中,应用更新不会删除。下次启动 DSH Desktop 时,插件会自动重新注入代码,恢复托盘功能。
安全设计¶
插件采用了五重防护机制防止重复注入和破坏文件:
1. 幂等标记:已带标记的文件不再改动。
2. 锚点消费:注入即锚点替换,锚点被消费后无法二次叠加。
3. 内容检测:无标记但内容已存在,仅补标记。
4. 整体原子性:任一锚点失配,整文件不写。
5. 备份 + 原子写:注入前备份,使用临时文件 + 重命名方式写入。
注意事项¶
- 破坏性修改:该插件会修改 DSH Desktop 的主程序文件(
resources/app/out/main/index.js、out/preload/index.cjs、package.json),属于破坏性修改,不是纯只读插件。 - 还原方法:如果 DSH Desktop 无法启动,可按顺序还原备份文件并恢复
package.json的main指向。 - 依赖:需要
@deepseek-ai/cordis (^4.0.1)和@deepseek-ai/dsh-host-webserver (^0.1.0-rc.6)。
卸载¶
- 移除插件:
dsh plugin --profile web remove dsh-desktop-tray,并删除配置文件中的对应条目。 - 手动恢复应用文件(如果不再需要托盘):
- 修改
resources/app/package.json,将main改回"./out/main/index.js"。 - 删除
resources/app/out/main/tray-boot.js。 - 使用备份文件(
*.dsh-tray.bak)覆盖还原对应文件。
- 修改
参考资料¶
- 插件目录:https://www.skillhub.cn/plugins/wodongx123/dsh-desktop-tray
- GitHub 仓库:https://github.com/wodongx123/dsh-desktop-tray