XP 引入快速使用者切換,允許在不登出的情況下切換帳號,各使用者擁有獨立桌面與設定檔,先前使用者的程式持續在背景執行。這對應用程式帶來新挑戰:必須偵測多使用者同時執行同一程式的情況並妥善處理資源衝突。
傳統 CreateMutex 預設範圍僅限單一 Session,無法跨使用者偵測。解法:在互斥體名稱前加上 Global\\ 前綴:
m_hMutexAppRunning = CreateMutex(NULL, FALSE, "Global\\EsXPSwitchUserApp");
呼叫 WTSRegisterSessionNotification 註冊接收 WM_WTSSESSION_CHANGE 訊息,wParam 包含事件類型,lParam 為 Session ID:
case WM_WTSSESSION_CHANGE:
switch (wParam) {
case WTS_CONSOLE_CONNECT: // 主控台連線
case WTS_CONSOLE_DISCONNECT: // 主控台斷線
case WTS_SESSION_LOGON: // 登入
case WTS_SESSION_LOGOFF: // 登出
case WTS_SESSION_LOCK: // 鎖定
case WTS_SESSION_UNLOCK: // 解鎖
case WTS_REMOTE_CONNECT: // 遠端連線
case WTS_REMOTE_DISCONNECT: // 遠端斷線
// 釋放/重新取得資源、更新狀態等
break;
}
break;
WTSRegisterSessionNotification 必須配對 WTSUnRegisterSessionNotification(程式結束時呼叫)。Wtsapi32.h、連結 Wtsapi32.lib。#include <windows.h> 前定義 #define _WIN32_WINNT 0x0501。WTSAPI32.dll)。