dsh-desktop-tray 插件介绍

前言

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。该插件采用“启动时自愈注入”机制:

  1. 应用启动时加载 tray-boot.js 启动器。
  2. 启动器读取插件内的补丁定义,检查主进程文件(out/main/index.js、out/preload/index.cjs)是否已注入。
  3. 未注入时,按锚点注入代码,并备份原文件为 *.dsh-tray.bak。
  4. 已注入时跳过(幂等操作)。

更新自愈:应用更新会覆盖 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)。

卸载

  1. 移除插件:dsh plugin --profile web remove dsh-desktop-tray,并删除配置文件中的对应条目。
  2. 手动恢复应用文件(如果不再需要托盘):
    • 修改 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜