XP 引入快速切換使用者,多 Session 並存。傳統單一實例互斥體僅限單一 Session,需加 Global\\ 前綴跨 Session 生效。另需處理 Session 狀態變更(鎖定、解鎖、登入、登出、切換)以釋放/重獲資源。
m_hMutex = CreateMutex(NULL, FALSE, _T("Global\\MyApp_SingleInstance_Mutex"));
if (GetLastError() == ERROR_ALREADY_EXISTS) {
// 已有實例運行於任一 Session
ExitProcess(0);
}
需定義 #define _WIN32_WINNT 0x0501 並連結 Wtsapi32.lib。
// 視窗建立時註冊
WTSRegisterSessionNotification(m_hWnd, NOTIFY_FOR_THIS_SESSION);
// 視窗銷毀時解除
WTSUnRegisterSessionNotification(m_hWnd);
WM_WTSSESSION_CHANGE 訊息case WM_WTSSESSION_CHANGE:
switch (wParam) {
case WTS_CONSOLE_CONNECT: // 實體主控台連接
case WTS_SESSION_LOGON: // 使用者登入
ReacquireResources(); break;
case WTS_CONSOLE_DISCONNECT: // 實體主控台斷開
case WTS_SESSION_LOGOFF: // 使用者登出
case WTS_SESSION_LOCK: // 工作站鎖定
ReleaseResources(); break;
case WTS_SESSION_UNLOCK: // 工作站解鎖
ReacquireResources(); break;
}
break;
WTSRegisterSessionNotification 必須配對 WTSUnRegisterSessionNotification。WTSAPI32.dll)。