dsh-window-state:让 DSH Desktop 主窗口记住位置与尺寸

前言

在 Windows 上使用 DSH Desktop 时,主窗口每次启动都会回到固定的 1280×820。桌面端创建窗口时把尺寸写死在代码里,也没有保存几何状态的逻辑。你调好的位置和大小,关掉再开就白费。社区插件 dsh-window-state(维护者 china-wkz)在 DSH 的插件体系里补上这一段:记住主窗口的位置、尺寸与最大化状态,下次启动原样恢复。适用平台仅为 Windows x64,且需要 DSH Desktop 0.2.2-rc.1 及以上;浏览器标签页里没有真实窗口,插件在那里不会启动。

这是什么

dsh-window-state 是 DeepSeek Harness 的客户端类插件,分类落在「客户端」。安装之后的行为可以概括为:你离开时窗口是什么样,下次打开就是什么样。

插件运行在 dsh-desktop-host 子进程里,通过 Win32 辅助进程读写窗口几何,把状态存成用户目录下的 JSON 文件;不写注册表、不加开机自启。DSH 生态倡导「一切皆插件」,目录站 SkillHub 上的插件页 与 GitHub 仓库 由社区维护,与 DeepSeek / 幻方无官方从属关系。当前仓库星标为 0,许可证为 MIT(package.json 版本 0.2.0)。

核心功能

下列能力均来自仓库 README,安装前可自行核对源码与许可证;插件以当前 DSH 进程权限运行。

  1. 位置 + 尺寸 + 最大化 一并记录;换显示器时加载会做虚拟屏幕钳制,避免窗口落在看不见的区域。
  2. 启动即还原:辅助进程在窗口显示前后极短时间内套用上次几何,通常看不到先小后大的跳变。
  3. 连续记录:移动、缩放、最大化由 WinEvent 钩子即刻写盘,另有默认 2 秒心跳补漏;断电、强杀也不依赖「退出时才存」。
  4. 轻量常驻:编译型 helper 约 15MB 内存、空载 CPU 为 0;系统缺少 csc.exe 时回退 PowerShell 实现(约 70MB)。
  5. 可读的状态文件:纯 JSON,可查看、可改、可删(删掉即重置)。
  6. 窄适用范围:只认 DeepSeek Harness.exe 的主窗口;CLI、无头模式、macOS/Linux 会静默跳过。

安装与启用

运行环境:DSH Desktop for Windows(0.2.2-rc.1 及以上)。任选下面一种方式;安装完成后都需要重启一次 DSH,profile 的 bundle 列表在启动时组装,重启后插件行才会挂上。

方式一:插件页安装(推荐)

  1. 打开 设置 → 插件;
  2. 点 添加插件 → 安装第三方插件;
  3. 在「包名或地址」里填入 dsh-window-state;若尚未发布到 npm,改用 github:china-wkz/dsh-window-state,直接从仓库安装;
  4. 安装完成后 重启 DSH。

方式二:本地源码目录(开发调试)

在「包名或地址」里填仓库的绝对路径,例如:

D:/code/dsh-window-state

改完代码后重启 DSH 即可生效,不需要打包。

方式三:手工写 profile

适合固定版本或离线环境。在 profile 的 package.json 里声明依赖,并在 dsh.profile.bundles 中写上包名:

// <profile>/package.json
{
  "dependencies": {
    "dsh-window-state": "^0.1.0"
  },
  "dsh": {
    "profile": {
      "bundles": [
        // ...
        "dsh-window-state"
      ]
    }
  }
}

只加依赖不写 bundle,包会被装进来但不会被加载。

验证与典型用法

按 README 建议,可以用下面步骤确认插件已生效。

  1. 打开 设置 → 插件,能看到 窗口状态记忆 卡片,开关为开;
  2. 拖动窗口、改个大小,然后完整退出 DSH(托盘里退出,不是只关窗口);
  3. 重新打开,窗口应回到离开时的位置和尺寸。

查看状态文件时间戳是否在更新:

Get-Content "$env:USERPROFILE\.dsh\desktop-window-state.json"

检查 PowerShell 回退版辅助进程是否在跑:

Get-CimInstance Win32_Process -Filter "Name='powershell.exe'" |
  Where-Object { $_.CommandLine -like '*window-state.ps1*' } |
  Select-Object ProcessId, CommandLine

默认状态文件路径为 %USERPROFILE%\.dsh\desktop-window-state.json(遵循 $DSH_HOME)。示例结构如下:

{
  "rect": { "x": 241, "y": 89, "width": 2016, "height": 1248 },
  "maximized": false,
  "dpi": 96,
  "savedAt": "2026-11-07T00:32:41.1234567Z"
}

重置:删除该文件,下次启动不再还原,并重新记录当前尺寸。手工验证某组几何时,可先写入 JSON 再重启 DSH 观察(README 提供了一行 PowerShell 示例)。

可选配置

插件行 config 全部可选,可在 profile 的 cordis.patch.yml 里覆盖,例如缩短心跳间隔:

- id: window-state
  name: dsh-window-state
  config:
    intervalMs: 400
字段 默认 说明
enabled true 为 false 时不启动辅助进程
stateFile $DSH_HOME/desktop-window-state.json 自定义状态文件路径
intervalMs 2000 心跳间隔,最小 500
exeName DeepSeek Harness.exe 目标进程映像名
titleHint DeepSeek Harness 窗口标题匹配串

工作原理(简述)

Host 半边判断是否为桌面环境、编译(仅首次)并启动 window-state-helper.exe,卸载时结束辅助进程。helper 用 C# 编写,首次由 Host 调用系统自带 csc.exe 编译,产物缓存在 $DSH_HOME/window-state-helper.exe;找不到编译器则使用 window-state.ps1,写同一状态文件。

一次启动的大致顺序是:Electron 创建隐藏主窗口 → helper 轮询到窗口后 SetWindowPos 套用上次几何(需要时再最大化)→ 外壳 show() → 安装 WinEvent 钩子持续写盘。最大化时只更新 maximized 标记,rect 保留最大化前的尺寸,下次先摆回再最大化。

适用场景与注意

适合:长期在 Windows 上用 DSH Desktop,希望主窗口尺寸与位置与上次一致,又不愿意自己改桌面端源码或做开机自启守护进程的用户。

注意:

  • 仅 Windows x64 + DSH Desktop;安装后必须重启一次才会加载。
  • helper 首次运行需 csc.exe 编译(约 100–300ms,之后走缓存);极慢机器上可能看到一次快速尺寸调整。
  • 只管理主窗口,登录页、更新弹窗等附属窗口不记录;若未来 DSH 官方实现窗口持久化,建议停用本插件以免冲突。
  • 安装前请阅读仓库源码与 MIT 许可证;插件与 DSH 同权限运行,第三方插件需自行评估信任边界。

排错速查

现象 先看什么
重启后窗口没还原 插件页开关是否开启;desktop-window-state.json 是否存在且 rect 合理
savedAt 一直不变 是否为桌面版;csc.exe 缺失时 PowerShell 是否被安全软件拦截
窗口跑到屏幕外 删除状态文件重置
装完列表里没有插件 是否已重启 DSH;bundles 是否包含 dsh-window-state

结尾

dsh-window-state 用插件生命周期内嵌的方式,在不改 DSH 核心的前提下补上主窗口几何持久化:状态是普通 JSON,DSH 关则辅助进程退,适合不想在系统里多留常驻服务的场景。

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

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

小夜