前言¶
在 DSH Desktop(Windows)里,窗口顶部约 36 像素是一条自绘的窗口拖动条,会话标题、子代理按钮以及部分插件画在顶部的工具栏都叠在这条带下面。拖动条层级最高,会先吃掉点击,因此会出现「最上方一片点不到」、给按钮加 -webkit-app-region: no-drag 也无效的情况。单纯收窄拖动区域又会让窗口不好拖。下面介绍的 dsh-top-drag 是 Mo3ter 维护的 DSH Desktop 客户端插件(仅 Windows),用「测量带」在拖动与点击之间按像素让位,不改应用布局,也不要求各插件单独适配。
这是什么¶
dsh-top-drag 针对桌面端 preload 注入的 #dsh-desktop-windows-drag-region 蒙层:在保持整条 36px 高度语义的前提下,把顶部切成多格,有可点 UI 的竖条让出点击,空白竖条保留拖动。在 DSH Web 或命令行 Harness 里脚本会先判断平台并保持惰性,不做任何事。
- 维护者:Mo3ter
- 分类:客户端
- 许可证:MIT(见仓库)
- 目录页:SkillHub 插件页
- 源码:GitHub — Mo3ter/dsh-top-drag
它修什么问题¶
DSH Desktop 在 Windows 下用固定定位的拖动蒙层(高度 36px、-webkit-app-region: drag),并把侧边栏与会话头内容上收,标题行从 y = 6 起画在蒙层下方。结果是:
- 窗口最上方可交互区域无法响应点击
- 会话标题、面包屑、子代理按钮点不到
- 在顶部自绘界面的插件(例如记忆类插件的工具栏)同样被挡
本插件不删蒙层作兜底:测量带就绪后才隐藏原有蒙层;脚本异常时仍回退为官方 shipped 行为。
核心机制¶
-
布局零改动
不增删 padding,不 patch 各页面;新装在顶部的插件界面会随几何测量自动避让。 -
16 格竖条
默认将顶部带切成 16 个小格(COLUMNS),每格只观察自己那一竖条:
- 存在可点元素(button、a[href]、表单控件,以及带role/tabindex/aria-label等选择器覆盖的节点)→ 该格收缩到元素上缘,点击优先
- 该竖条无候选 → 保留完整 36px 条带,拖动优先 -
可点判定
一次querySelectorAll加各候选的getBoundingClientRect,不做逐点 hit test,也刻意不用MutationObserver(避免聊天流式输出时频繁触发)。 -
弹窗
存在dialog[open]、[role=dialog]、[aria-modal=true]时整条测量带让位,模态对话框占满点击。 -
开销
按需测量、不轮询。触发包括:指针进入距顶 44px 内、切换主面板、窗口缩放、手动dsh-top-band-rescan事件,以及约 10 秒一次兜底;两次扫描间隔不少于 700ms(MIN_GAP_MS)。README 称长会话下一次扫描约 4ms 量级。
安装与启用¶
插件以当前 DSH 进程权限运行;安装前建议自行查看 lib/index.js 与许可证。
从 GitHub 安装(README 原文):
dsh plugin add github:Mo3ter/dsh-top-drag
其他 README 记载方式:
dsh plugin add dsh-top-drag
dsh plugin add file:./dsh-top-drag
插件市场上架后也可一键安装(以目录页说明为准)。
Host 平面插件需 重启 Harness;DSH Desktop 在 下次启动 时加载。当前 package 版本为 1.7.1,要求 Node >= 20。
典型用法与调参¶
日常无需配置:装上即可。若顶部 UI 变更后拖动/点击区域未及时更新,可在控制台或自有脚本里触发重扫:
window.dispatchEvent(new Event('dsh-top-band-rescan'));
可调常量位于 lib/index.js 文件顶部:
| 常量 | 含义 |
|---|---|
COLUMNS |
测量带格数(默认 16) |
STRIP |
带高度像素(默认 36) |
PILL_* |
中间列空闲时绘制的小提示把手 |
MIN_GAP_MS |
两次扫描最小间隔(默认 700) |
SAFETY_TICK_MS |
兜底定时(默认 10000) |
README 中文段还提到 SELECTOR;以仓库当前 lib/index.js 为准。
卸载:
dsh plugin remove dsh-top-drag
或从 profile 的 cordis.patch.yml 中移除对应行;README 说明不会向 profile 外写入文件。
适用场景与注意¶
适合:在 Windows 上使用 DSH Desktop,且需要点击顶部会话头、子代理入口或插件顶栏,同时仍要从标题区域拖动窗口的用户。
注意:
- 仅 Windows,且依赖 preload 的 overlay id 与
dsh-desktop-windows-titlebar-layout等约定;未来 Desktop 变更相关实现时,插件可能保持惰性而不生效,README 称设计上不破坏拖动。 - 无遥测、无网络访问;整包为单 host 文件,经
webserver/index-inject向index.html注入一行<style>与一行<script>。 - SkillHub 等为社区目录,与 DeepSeek / 幻方无官方从属关系;星标等以各站点当时展示为准。
结尾¶
dsh-top-drag 把「一条盖满顶的拖动蒙层」换成按列几何让位的测量带,在不大改 DSH Desktop 布局的前提下,缓解 Windows 下顶部 UI 点不到的问题。进一步了解与安装入口:
- 目录页:https://www.skillhub.cn/plugins/Mo3ter/dsh-top-drag
- GitHub:https://github.com/Mo3ter/dsh-top-drag