功能
`SetProcessWindowStation` 將呼叫進程關聯到指定的 **Window Station (窗口站)**,使該進程後續建立的視窗、執行緒預設在此 Window Station 下的桌面運行。
簽名
BOOL SetProcessWindowStation(HWINSTA hWinSta);
典型使用流程
- 開啟/建立目標 Window Station**:
HWINSTA hWinSta = OpenWindowStation(L"WinSta0", FALSE, WINSTA_ALL_ACCESS);
// 或建立新站
HWINSTA hNew = CreateWindowStation(L"MyWinSta", 0, WINSTA_ALL_ACCESS, NULL);
- 切換進程關聯**:
if (!SetProcessWindowStation(hWinSta)) {
DWORD err = GetLastError(); // 處理失敗
}
- (可選)切換桌面**:Window Station 內可有多個桌面,需 `SetThreadDesktop(hDesk)` 讓當前執行緒使用特定桌面。
- 建立視窗/程序**:此後 `CreateWindowEx`、`CreateProcess` (with `lpDesktop`) 將在該站/桌面下運行。
常見場景
- 服務程式互動桌面:Windows 服務預設在 `Service-0x0-3e7$` 非互動站,若需顯示 UI,必須 `OpenWindowStation("WinSta0")` → `SetProcessWindowStation` → `OpenDesktop("Default")` → `SetThreadDesktop` → `CreateProcessAsUser` 帶 `lpDesktop="WinSta0\\Default"`。
- 多桌面切換工具:建立獨立 Window Station 隔離安全桌面(如密碼輸入、安全瀏覽)。
- 自動化測試/遠端桌面:在特定站/桌面啟動被測應用,避免干擾主桌面。
權限要求
- 進程需 `WINSTA_SWITCHDESKTOP`、`WINSTA_ACCESSCLIPBOARD`、`WINSTA_ACCESSGLOBALATOMS` 等存取權。
- 服務以 `LocalSystem` 或具備 `SeTcbPrivilege` 的帳號較易成功。
參考資源
總結
`SetProcessWindowStation` 用於**將進程綁定到指定 Window Station**,配合 `SetThreadDesktop` 實現桌面切換、服務互動 UI、安全隔離。關鍵在於取得目標站句柄、擁有足夠權限、後續視窗/建立進程自動繼承關聯。