dsh-top-drag:Windows 桌面端顶部拖动与点击共存

前言

在 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 里脚本会先判断平台并保持惰性,不做任何事。

它修什么问题

DSH Desktop 在 Windows 下用固定定位的拖动蒙层(高度 36px、-webkit-app-region: drag),并把侧边栏与会话头内容上收,标题行从 y = 6 起画在蒙层下方。结果是:

  • 窗口最上方可交互区域无法响应点击
  • 会话标题、面包屑、子代理按钮点不到
  • 在顶部自绘界面的插件(例如记忆类插件的工具栏)同样被挡

本插件不删蒙层作兜底:测量带就绪后才隐藏原有蒙层;脚本异常时仍回退为官方 shipped 行为。

核心机制

  1. 布局零改动
    不增删 padding,不 patch 各页面;新装在顶部的插件界面会随几何测量自动避让。

  2. 16 格竖条
    默认将顶部带切成 16 个小格(COLUMNS),每格只观察自己那一竖条:
    - 存在可点元素(button、a[href]、表单控件,以及带 role / tabindex / aria-label 等选择器覆盖的节点)→ 该格收缩到元素上缘,点击优先
    - 该竖条无候选 → 保留完整 36px 条带,拖动优先

  3. 可点判定
    一次 querySelectorAll 加各候选的 getBoundingClientRect,不做逐点 hit test,也刻意不用 MutationObserver(避免聊天流式输出时频繁触发)。

  4. 弹窗
    存在 dialog[open]、[role=dialog]、[aria-modal=true] 时整条测量带让位,模态对话框占满点击。

  5. 开销
    按需测量、不轮询。触发包括:指针进入距顶 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
羽毛球分组比赛记分
小程序二维码

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

Xiaoye