dsh-titlebar-restart:在 DSH 标题栏菜单里加「重启」

前言

做 DSH 桌面端开发或日常用时,改 profile 插件、调 Connection 路由之后,往往需要完整退出再打开一次客户端,才能让 bundle 挂载或新逻辑生效。从任务管理器结束进程再点开快捷方式,步骤多,也容易点错别的 Electron 壳。

下面介绍社区插件 dsh-titlebar-restart(维护者 NyaNyaHua4290):仅在 Windows 上的 DSH 桌面版 生效,在窗口标题栏 应用 / 编辑 菜单后追加 重启 项;连点两次后,由 WMI 拉起的 PowerShell 结束当前主进程与 Host,再启动同一个可执行文件,无需手改 Program Files 下的安装目录。

这是什么

  • 名称:dsh-titlebar-restart(npm 包名与插件市场标识一致)
  • 定位:客户端向插件——一半改 Electron preload 绘制的标题栏菜单,一半在 Connection 上注册重启 API
  • 仓库:github.com/NyaNyaHua4290/dsh-titlebar-restart,许可证 MIT;当前 package.json 版本 0.1.0,要求 Node 22+、dsh >= 0.2.1-rc.1
  • 市场分类(README):开发与运行时(dev)

标题栏菜单不在 Web 插槽体系里,因此实现分成 宿主半 与 浏览器半,二者通过带鉴权的 HTTP 协同。

核心功能

标题栏菜单项

浏览器半等待 preload 挂出 [data-windows-menu] 的开放 shadow root,在其中的 [role=menubar] 追加 <button role="menuitem">。样式继承 preload 自带的 button 规则,视觉上与 编辑 一致。

交互为二次确认:

  1. 第一次点击:文案变为 确认重启
  2. 四秒内再点一次:变为 重启中…,并发起真正的 POST

宿主 API

宿主半在 Connection 通道注册路由 POST /api/titlebar-restart(经 ctx.connection.fetch)。Connection 插件先做 Host/Origin 与会话 Cookie 校验,未通过者无法到达本插件。

重启流程

宿主写出短 PowerShell,用 WMI Win32_Process.Create 拉起脚本,父进程为 WmiPrvSE,从而能在结束当前进程树之后仍执行完重启逻辑:

  1. 等待约 0.9 秒,让 HTTP 响应先返回浏览器
  2. 结束 Electron 主进程与本 Host
  3. 等待监听端口释放
  4. 重新启动同一个可执行文件

整体约 3~4 秒。日志与生成脚本目录:%TEMP%\dsh-titlebar-restart\(restart.log、restart.ps1、launch.ps1)。若某次未能自动回到界面,可手动执行 restart.ps1 排查。

不修改 Program Files 下任何文件;属于普通 profile 插件,桌面版升级不会覆盖它。

非桌面环境的行为

用 dsh web 起的服务没有窗口与标题栏菜单,路由会返回 409 not-desktop,浏览器半保持静默。macOS 与 Linux 不支持。

安装与启用

在 DSH 内:插件 → 发现 安装,或在本机 profile 下执行:

dsh plugin --profile <profile> add dsh-titlebar-restart

若未从市场分发、需要直接从仓库安装(本机需有 git):

dsh plugin --profile <profile> add github:NyaNyaHua4290/dsh-titlebar-restart

安装完成后 重启一次 DSH,让 bundle 挂载。

典型用法

  1. 确认当前是 Windows 上的 DSH 桌面版(非 dsh web 单独起的无窗服务)。
  2. 安装插件并重启 DSH 后,打开任意带标题栏菜单的窗口。
  3. 在标题栏 应用 / 编辑 区域找到 重启,点一次进入确认,四秒内再点一次执行重启。
  4. 重启会中断正在运行的一切(含当前对话);README 说明会话会落盘,重启后自动恢复。

排查失败重启时,可查看 %TEMP%\dsh-titlebar-restart\restart.log,或尝试运行同目录下的 restart.ps1。

适用场景与注意

适合:经常在 Windows 桌面版上试验 profile 插件、Connection 路由或需要「干净重启同一 exe」的开发者与用户。

务必注意:

  • 路由仅对持有 Web UI 会话 Cookie 的请求开放;未鉴权请求在 Connection 层被拒。
  • 仅当 Host 的父进程是 Electron 桌面壳时才执行结束进程;dsh web 场景不会去结束你的终端。
  • 点重启会打断所有进行中的任务;安装与使用前宜阅读仓库源码与 MIT 许可证。插件以当前 dsh 进程权限 运行,安装前应自行核对源码与权限边界。
  • 卸载:市场卸载或 dsh plugin remove;%TEMP%\dsh-titlebar-restart\ 可手动删除。

结尾

dsh-titlebar-restart 把「结束并重启同一桌面可执行文件」收进标题栏菜单,用 WMI 隔离脚本父进程,避免重启逻辑随当前进程一起被杀掉。若你主要在 Windows DSH 桌面版上迭代插件或配置,它比反复从外部杀进程更省事。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye