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

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

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

小夜