dsh-page-zoom:DeepSeek Harness 桌面版的整页缩放

前言

DeepSeek Harness 桌面版在查看长对话、代码或复杂界面时,需要频繁调整查看比例。浏览器自带缩放,但桌面应用窗口没有类似快捷方式。如果手动缩放,页面布局和坐标计算会错位;如果依赖系统缩放,则无法精细控制档位。dsh-page-zoom 插件用浏览器式的整页缩放方案,解决了这个问题。

是什么

dsh-page-zoom 是一个客户端插件,给 DeepSeek Harness 桌面版(@deepseek-ai/dsh-desktop)使用。它通过注入 CSS zoom 和测量/坐标校正,让整个界面随缩放倍数重排,而不是简单的位图放大。插件维护者 qydxd1,目前有 0 个星标。它通过 window.dshDesktop 判断是否在桌面窗口中生效,网页版不受影响。

核心功能

  • 按住 Ctrl 滚动滚轮(触控板双指捏合同理),按浏览器常用档位放大/缩小
  • 按 Ctrl + 0 回到 100%
  • 顶部短暂显示百分比胶囊(− / 百分比 / + / ↺),1.8 秒后自动消失
  • 缩放倍数存在 localStorage 的 dsh.page-zoom.v1,下次启动自动恢复
  • 按档位放大/缩小:50% 67% 75% 80% 90% 100% 110% 125% 150% 175% 200% 250% 300%
  • 支持键盘快捷键 Ctrl + Shift + = / - 放大/缩小(滚轮不可用时)
  • 同时校正测量面与指针坐标,确保浮层、拖拽、菜单等位置正确

安装与启用

dsh-page-zoom 是一个 bundle(客户端插件),需要安装到 Harness 的 profile 中。

plugin_manager → action: install_bundle → target: <这个目录的绝对路径>

安装完成后,在「插件」列表中可以看到 Page zoom / 页面缩放。启用后,在桌面窗口顶部按 Ctrl + 滚轮即可看到百分比胶囊。

注意事项:

  • 需要桌面版(@deepseek-ai/dsh-desktop),开发时验证过 0.2.1-rc.2
  • 插件通过 dsh.client.inject 依赖 @deepseek-ai/dsh-client-ui-layout,这是 Harness 自带的包
  • 从本机目录 link 安装时,不要删除这个目录,否则插件会断开;想彻底移除,请在插件管理中禁用并移除 dsh-page-zoom

实现原理

插件没有在窗口层面做缩放,因为桌面壳(resources/app.asar 里的 lib/main.js)是只读打包产物,没有暴露缩放接口(既没有 webContents.setZoomFactor,也没有 IPC 通道)。因此缩放在页面层面实现:

  • 给 <body> 设 CSS zoom,让布局按缩放后的 CSS 尺寸重排,文字清晰
  • 把 <html> 和 <body> 的宽高设成「视口 ÷ 缩放倍数」,保证 html → body → #root → 框架 这条高度链在放大后仍然填满窗口
  • 给 <body> 加 contain: layout,让 position: fixed 的浮层(弹窗、toast、菜单)锚定到 body,随页面一起缩放
  • 校正测量面:getBoundingClientRect() / getClientRects()(含 Range)、innerWidth / innerHeight 和 documentElement.clientWidth/Height 都除以倍数,避免列宽、浮层定位和拖拽错位
  • 校正指针坐标:MouseEvent 的 clientX/clientY、pageX/pageY、offsetX/offsetY、x/y、movementX/movementY 除以倍数;document.elementFromPoint() / elementsFromPoint() 在内部先乘回倍数再问浏览器,调用方照旧传布局像素
  • WheelEvent 的 deltaX/deltaY 不换算——它描述滚轮走了多远,不是文档滚了多远,保持浏览器口径
  • 校正 visualViewport 的 width/height/offsetLeft/offsetTop/pageLeft/pageTop,避免底部工作台(dsh-better-sidebar)高度错位
  • 视口单位(vh/dvh/vw)在 zoom 子树里仍然按真实窗口解析,插件注入一小段样式把它们重新指向布局视口(--page-zoom-vh 每次缩放时由插件写入),确保「按视口高度定尺寸」的盒子不会被放大
  • 对原生视图(设置 → 账号 → 「查询用量」/「充值」打开的 DeepSeek 平台页)不做除法校正,让占位元素上的 ResizeObserver 触发重报,保证原生视图盖在正确的位置和大小上

测试与调试

插件提供自检页和 CDP 回归脚本:

  • 自检页:test/selftest.html,加载真实 client.js,28 条断言覆盖尺寸链、滚动条、测量面、指针坐标、elementFromPoint、visualViewport、vh 宿主、原生视图 bounds、滚轮灵敏度、原生占位元素重报、复位与卸载还原
  • CDP 回归:tools/cdp-zoom-hit.mjs,需要占一个本地调试端口,某些环境会拒绝 bind()(WSAEACCES),那时使用自检页即可

适用场景与注意

  • 适合需要频繁查看大段对话、代码或复杂界面的开发者
  • 插件以当前 dsh 进程权限运行,安装前建议检查源码与许可证(MIT)
  • 缩放只作用于桌面窗口,网页版由浏览器原生缩放处理
  • 在 win32 下,桌面窗口使用自绘标题栏,缩放时标题栏内边距会跟着变化(40px),这是正常表现
  • 插件会临时改写 Element / Range / MouseEvent / VisualViewport 的原型 getter,卸载时全部还原;如果其他插件硬编码了 vh/vw 尺寸或不经过 getBoundingClientRect() 的定位计算,需要自行适配

结尾

dsh-page-zoom 提供了一套浏览器式的整页缩放方案,让 DeepSeek Harness 桌面版能够按档位放大/缩小整个界面,同时保持布局和交互的正确性。适合需要精细控制查看比例的开发者使用。插件目录页:https://www.skillhub.cn/plugins/qydxd1/dsh-page-zoom;GitHub:https://github.com/qydxd1/dsh-page-zoom

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

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

Xiaoye