Windows 系統匣工具
每個程式一個音量,
一次點擊完成。
Chrome 30%、Teams 70%、Spotify 20%。不必每次開啟音量混音程式逐一調整,一個設定檔就能全部還原。系統匣選單兩次點擊,管理介面裡一個滑桿。
點擊系統匣圖示開啟的管理介面。同樣的值也能直接從選單修改。
能做什麼
過去在音量混音程式裡做的事,現在從系統匣兩次點擊完成。
各程式的音量與靜音
把正在發出聲音的工作階段依程式歸併顯示。像 Chrome 這種有多個處理程序的程式也只佔一行。
每個程式不同的輸出裝置
遊戲走喇叭,Discord 走耳機。預設輸出裝置也能直接從選單切換,設定檔會把裝置一起儲存。
關掉程式再開啟依然保持
記住每個程式的音量,等那個程式 再次播放時 自動還原。拔插裝置、從睡眠喚醒,也會重新套用設定檔。
麥克風也在同一隻手裡
開會時最急的那個按鈕。 CtrlAltK 一次就能開關麥克風。
管理介面
編輯設定檔、修改快速鍵、撰寫自動化規則,全都在介面裡完成。不必手動改設定檔案。
出去的只有你開啟的
匿名使用回報、檢查更新、開發者通知,就這三項,而且 全部預設關閉。管理介面只在 127.0.0.1 上開放,還需要每次執行新產生的權杖才能開啟。
設定檔
情況變了,所有程式的音量也該跟著變。
預設內建三個,也可以把目前狀態直接存成新的設定檔。自動切換(程式啟動、裝置接上、時段)預設關閉。
| 設定檔 | 主音量 | 程式設定 |
|---|---|---|
| Work | 72% | Chrome 30% · Teams 70% · Spotify 20% |
| Gaming | 80% | Discord 65% · Spotify 15% · 瀏覽器靜音 |
| Meeting | 60% | Teams 80% · Zoom 80% · Chrome 20% · Spotify 靜音 |
快速鍵
當手已經放在鍵盤上時。
全部可以修改,若其他程式已佔用該組合鍵,會明確告知,而不是靜靜失敗。
- CtrlAlt↑ 調高主音量
- CtrlAlt↓ 調低主音量
- CtrlAltM 靜音
- CtrlAltK 麥克風靜音
- CtrlAltS 彈出介面
- CtrlAlt1–3 切換設定檔
應用程式路由
Windows 沒有寫進文件的那條路, 先驗證 再使用。
實測
「只讓這個程式走耳機」沒有公開 API。必須呼叫 Windows 設定應用程式所用的內部介面 Windows.Media.Internal.AudioPolicyConfig ,而它的介面 ID 與 vtable 配置在每個組建裡都不同。SoundDesk 不靠猜測使用它。
危險的第一次呼叫放在 獨立處理程序裡執行,即使當掉系統匣也能存活;真正移動程式之後再用 Get 讀回,只有讀到同一個裝置才升級為「已驗證」。讀回結果不一致時,功能會自行關閉並開啟 Windows 設定頁面。
| 狀態 | 依據 |
|---|---|
| verified | 確實移動了處理程序,讀回的 endpoint id 一致。若沒有任何程式在播放,自我檢測會用無聲串流替自己建立工作階段,用自己來驗證 |
| probable | 無法造出可供讀回的對象 — 只能確認工廠啟用與 vtable 呼叫沒有當掉 |
| unsupported | 自我檢測失敗,或呼叫成功但 Windows 未生效 → 引導至設定頁面 |
安全
即使從下載資料夾直接執行也安全。
這些是可攜式執行檔真正會遇到的問題。不是抽象的檢查清單,每一條都有對應的程式碼與測試。
| 威脅 | 因應 |
|---|---|
| DLL 劫持 放在 exe 旁邊的偽造 DLL |
系統 DLL 只以 System32 絕對路徑載入。啟動時把 exe 所在資料夾與工作目錄從搜尋路徑中移除 |
| Mutex 搶佔 其他工作階段搶先佔用名稱,阻止啟動 |
把單一執行個體物件放在 Local\ 命名空間 |
| 透過設定檔案注入 | 只有通過正規表示式驗證的 endpoint id 才會傳入 COM 呼叫 |
| 偽造記錄 在處理程序名稱裡塞入換行以插入假記錄 |
程式與裝置名稱先移除控制字元,再限制長度 |
| 沒有引號的自動啟動路徑 | Run 機碼的值一律是用引號括起的絕對路徑,且只用 HKCU 。 |
| 對管理介面的越權操作 同一台電腦上的其他程式,或網頁 |
127.0.0.1 專用 + 每次執行產生新的 256 位元權杖 + Host 與 Origin 檢查。權杖在首次載入時變成 HttpOnly Cookie,從網址列消失 |
隱私
只有你開啟的才會出去。
程式名稱與工作階段資訊只在本機處理,設定僅保存為一個 JSON 檔案。會對外連線的功能只有三項 — 匿名使用回報、檢查更新、開發者通知 — 且全部預設關閉。在管理介面裡開啟之前,一個請求也不會送出。
| 設定檔案 | %APPDATA%\SoundDesk\config.json |
|---|---|
| 記錄 | %APPDATA%\SoundDesk\sounddesk.log |
| 匿名使用回報 | 預設關閉 — 開啟後每天一次,送出隨機安裝 id、版本、Windows 組建、語言,以及三個計數 |
| 檢查更新 · 開發者通知 | 預設關閉 — 開啟後只送出執行中的版本與語言。不送出安裝 id |
| 絕對不會送出的內容 | 程式名稱 · 裝置名稱 · 檔案路徑 · Windows 帳戶名稱 |
| 使用的 API | IMMDeviceEnumerator · IAudioSessionManager2 · ISimpleAudioVolume · IPolicyConfig · AudioPolicyConfig |
| 自動啟動 | HKCU\Software\Microsoft\Windows\CurrentVersion\Run(選用) |
自我檢測
在你的電腦上能不能用,直接問這個程式。
把自己的功能逐項放到真實音訊堆疊上跑一遍, 動過的都會還原。會發出聲音的變更根本不做 — 主音量是把目前的值原樣重寫一次,只證明呼叫路徑是通的。
| 指令 | 檢查什麼 |
|---|---|
| --selftest-audio | 裝置 · 主音量 · 麥克風 · 各程式的音量/靜音/路由 · 設定檔 · 全域快速鍵。沒有程式在播放時,路由用它自己的無聲工作階段來驗證 |
| --selftest-panel | 打包後的執行檔是否真的能提供管理介面 |
| --report | 以 JSON 輸出裝置、工作階段與設定檔現況 |
這台電腦上的結果
OK 各程式音量(firefox.exe 100% → 42% → 還原)
OK 各程式靜音
OK 各程式輸出路由(firefox.exe → ASUS VZ279 → 還原)
OK 預設裝置切換 · 設定檔 · 全域快速鍵
— 麥克風(本機沒有輸入裝置)
11 passed, 0 failed, 2 skipped — Windows 10 22H2 組建 19045
在哪裡都一樣
用你的語言,在你的電腦上。
同一套設定在家裡與公司通用,用你的語言閱讀,需要時從巨集呼叫。
12 種語言
跟隨 Windows 顯示語言。也可以自己選,改了之後管理介面與系統匣選單無需重新啟動就地切換。
한국어 · English · 日本語 · 简体中文 · 繁體中文 · Español · Português · Français · Deutsch · Русский · Italiano · Tiếng Việt
家裡與公司,同一套設定
把設定檔、快速鍵、規則匯出成一個檔案,在另一台電腦上匯入。裝置依 名稱 比對 — 同一副耳機在每台電腦上的 id 都不同,直接複製檔案會讓路由靜靜消失。本機沒有的裝置會告訴你名稱。
從巨集呼叫
在 Stream Deck 按鈕或一行 AutoHotkey 裡直接使用。系統匣開著或沒開都能運作,也不會再跳一個圖示。有變化回傳結束碼 0,什麼都沒符合回傳 1。
SoundDesk.exe --set-app chrome.exe=25
SoundDesk.exe --profile Gaming
SoundDesk.exe --list apps
安裝
一個檔案。沒有安裝程式。
SoundDesk.exe 放在任何你喜歡的位置執行,系統匣就會出現圖示。想移除時,刪掉檔案與設定資料夾即可。不需要 Python。