前言¶
在 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 进程权限运行。
- 位置 + 尺寸 + 最大化 一并记录;换显示器时加载会做虚拟屏幕钳制,避免窗口落在看不见的区域。
- 启动即还原:辅助进程在窗口显示前后极短时间内套用上次几何,通常看不到先小后大的跳变。
- 连续记录:移动、缩放、最大化由 WinEvent 钩子即刻写盘,另有默认 2 秒心跳补漏;断电、强杀也不依赖「退出时才存」。
- 轻量常驻:编译型 helper 约 15MB 内存、空载 CPU 为 0;系统缺少
csc.exe时回退 PowerShell 实现(约 70MB)。 - 可读的状态文件:纯 JSON,可查看、可改、可删(删掉即重置)。
- 窄适用范围:只认
DeepSeek Harness.exe的主窗口;CLI、无头模式、macOS/Linux 会静默跳过。
安装与启用¶
运行环境:DSH Desktop for Windows(0.2.2-rc.1 及以上)。任选下面一种方式;安装完成后都需要重启一次 DSH,profile 的 bundle 列表在启动时组装,重启后插件行才会挂上。
方式一:插件页安装(推荐)¶
- 打开 设置 → 插件;
- 点 添加插件 → 安装第三方插件;
- 在「包名或地址」里填入
dsh-window-state;若尚未发布到 npm,改用github:china-wkz/dsh-window-state,直接从仓库安装; - 安装完成后 重启 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 建议,可以用下面步骤确认插件已生效。
- 打开 设置 → 插件,能看到 窗口状态记忆 卡片,开关为开;
- 拖动窗口、改个大小,然后完整退出 DSH(托盘里退出,不是只关窗口);
- 重新打开,窗口应回到离开时的位置和尺寸。
查看状态文件时间戳是否在更新:
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 关则辅助进程退,适合不想在系统里多留常驻服务的场景。