dsh-always-on-top:为 DSH Desktop 标题栏增加窗口置顶

前言

在 Windows 上长时间对照文档、终端和浏览器时,DSH Desktop 窗口很容易被其他应用盖住,需要反复 Alt+Tab 切回。系统自带的「置顶」能力往往藏在右键菜单或第三方工具里,和 DSH 的插件化工作流也不在同一套配置里。下面介绍社区插件 dsh-always-on-top:在 DSH Desktop 标题栏右侧、最小化按钮左侧增加一枚图钉按钮,点一次置顶、再点一次取消,状态会记住并在下次启动时恢复。

这是什么

dsh-always-on-top 由维护者 Suibianlilili 发布,归类为 DSH 客户端插件。官方描述是:在 DSH Desktop 标题栏提供一枚小型图钉按钮,单击即可让窗口保持在所有其他窗口之上,再单击则释放置顶。

实现上体量很小:一条 host 路由加一段 client 脚本,无额外依赖、无需构建步骤,解压约 30 KB。包名与 npm 发布名均为 dsh-always-on-top,当前资料中的版本为 0.1.4,许可证 MIT。

核心功能

根据 GitHub README 与包清单,已核实的能力如下:

  1. 标题栏图钉:按钮位于标题栏右端、Windows 最小化按钮左侧。
  2. Win32 置顶:通过 WS_EX_TOPMOST 窗口样式切换始终置顶;置顶时按钮变蓝,工具提示为「Always on top — click to unpin」(未置顶时为灰色)。
  3. 状态持久化:置顶状态写入 $DSH_HOME/dsh-always-on-top.json(默认 ~/.dsh/),下次启动会重新应用。
  4. 环境感知:仅在 Windows 上的 DSH Desktop(Electron)内显示;在 dsh web(浏览器)及其他操作系统下自动隐藏。

安装与启用

包已发布到 npm。README 说明:desktop profile 由 Electron 应用持有,DSH CLI 不会直接管理该 profile,需用下文命令或在应用内的插件设置安装。

从 npm 安装(推荐)

适用于 DSH CLI(web / tui profiles)时,可先加到 web profile;若目标是桌面端,应装到 desktop profile 并改 bundles。

# DSH CLI(web / tui profiles)
dsh plugin --profile web add dsh-always-on-top

# 或直接加到 desktop profile
pnpm -C "$env:USERPROFILE\.dsh\profiles\desktop" add dsh-always-on-top

# 然后将 "dsh-always-on-top" 写入 dsh.profile.bundles,并重启应用

从 GitHub 安装

pnpm -C "$env:USERPROFILE\.dsh\profiles\desktop" add "github:Suibianlilili/dsh-always-on-top"

# 然后将 "dsh-always-on-top" 写入 dsh.profile.bundles,并重启应用

手动步骤

# 1. 将包装入 profile
pnpm -C "$env:USERPROFILE\.dsh\profiles\desktop" add dsh-always-on-top

# 2. 在 package.json 的 dsh.profile.bundles 中加入 "dsh-always-on-top"

# 3. 重启应用

经过上面的步骤,重启 DSH Desktop 后标题栏应出现图钉控件。

典型用法

图钉在标题栏最右侧、最小化按钮左侧:

  • 灰色:未置顶
  • 蓝色:已置顶

单击即可切换。工具提示随系统语言显示英文或中文。

单次切换大约需要 0.4–0.6 秒(host 会启动 PowerShell 编译 P/Invoke 声明),按钮会显示忙碌状态,属 README 中说明的预期行为。

工作原理(简要)

插件运行在 DSH host 进程;Electron 主进程拥有窗口,且 host 的 process.ppid 即该主进程。流程为:

  1. 客户端点击后 POST /dsh-always-on-top/toggle
  2. host 用 Get-Process -Id <ppid> 解析主窗口句柄
  3. PowerShell 调用 user32!SetWindowPos 设置或清除 WS_EX_TOPMOST
  4. host 读回 GetWindowLong(GWL_EXSTYLE),仅在样式位确实变化时报告成功

不修改 Electron 源码、不向主进程注入代码,也不依赖未公开 API。

兼容性与限制

项目 要求
操作系统 Windows 10 / 11
运行时 DSH Desktop(Electron)
DSH 0.2.x(dsh.client 注入),资料中在 0.2.1-rc.2 上测试

限制(来自官方文档):

  • 只影响主窗口;欢迎页、更新对话框等不受影响。
  • 若未来 DSH 改版标题栏高度或控件区域,可能需在 lib/client.js 的 CSS 中调整 right(当前 146px)与 top(当前 7px)。

适用场景与注意

适合谁: 在 Windows 上用 DSH Desktop 做开发或运维、需要窗口长期浮在最前、又不想离开 DSH 插件生态的用户。

安装前建议: DSH 插件在 当前 dsh 进程权限 下运行;置顶会调用 Win32 API 并读写 $DSH_HOME 下的状态文件。安装前应阅读 仓库源码 与 MIT 许可证,确认符合你的安全策略。社区目录 SkillHub 插件页 为独立站点,与 DeepSeek / 幻方无官方从属关系,不宜当作官方应用商店。

结尾

dsh-always-on-top 把「窗口始终置顶」收成标题栏上的一个开关,配置走 desktop profile 的 bundles,行为透明、依赖极少。需要查阅安装细节或贡献代码时,可看目录页与 GitHub:

  • 目录页:https://www.skillhub.cn/plugins/Suibianlilili/dsh-always-on-top
  • GitHub:https://github.com/Suibianlilili/dsh-always-on-top
羽毛球分组比赛记分
小程序二维码

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

小夜