核心 API 流程
CreateDesktop("Virtual", ...) 創建名為 "Virtual" 的新桌面對象。
GetThreadDesktop(GetCurrentThreadId()) 獲取當前桌面句柄備份。
- 啟動
explorer.exe 於虛擬桌面:STARTUPINFO.lpDesktop = "Virtual" + CreateProcess。
RegisterHotKey(hwnd, id, MOD_ALT, 'Q') 註冊 Alt+Q 熱鍵。
- 熱鍵回調中
SwitchDesktop(hVirtualDesk) / SwitchDesktop(hCurrent) 切換。
- 退出時
TerminateProcess 結束 explorer,CloseDesktop 釋放資源。
關鍵代碼片段
HDESK hVirtualDesk, hCurrent;
PROCESS_INFORMATION piExplor;
void StartExplorer() {
STARTUPINFO si = { sizeof(si) };
si.lpDesktop = "Virtual";
CreateProcess(NULL, "explorer", NULL, NULL, FALSE, 0, NULL, NULL, &si, &piExplor);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
static HDESK hNow;
switch (msg) {
case WM_HOTKEY:
if (wp == 0x0001) { // Alt+Q
hNow = (hNow == hCurrent) ? SwitchDesktop(hVirtualDesk), hVirtualDesk
: SwitchDesktop(hCurrent), hCurrent;
} else if (wp == 0x0002) { // F8 退出
TerminateProcess(piExplor.hProcess, 1);
CloseDesktop(hVirtualDesk);
PostMessage(hwnd, WM_CLOSE, 0, 0);
}
break;
case WM_DESTROY:
SwitchDesktop(hCurrent); // 確保回到原桌面
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, msg, wp, lp);
}
實用場景
- 隱私保護:敏感操作在虛擬桌面,熱鍵一鍵切換隱藏。
- 多任務隔離:不同專案分配不同虛擬桌面,互不干擾。
- 自動化測試:在乾淨桌面環境運行 GUI 自動化腳本。
注意事項
- 需管理員權限運行(創建桌面、註冊全局熱鍵)。
- 虛擬桌面內啟動的進程無法直接與主桌面進程通訊,需 IPC。
- 退出務必切回原桌面,否則用戶會「卡」在空桌面。