前言¶
在 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 關則輔助進程退,適合不想在系統裏多留常駐服務的場景。