首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

Windows XP 快速切換使用者程式設計:全域互斥體與 Session 變更通知

     編輯:關於VC++

XP 引入快速切換使用者,多 Session 並存。傳統單一實例互斥體僅限單一 Session,需加 Global\\ 前綴跨 Session 生效。另需處理 Session 狀態變更(鎖定、解鎖、登入、登出、切換)以釋放/重獲資源。

跨 Session 單一實例互斥體

m_hMutex = CreateMutex(NULL, FALSE, _T("Global\\MyApp_SingleInstance_Mutex"));
if (GetLastError() == ERROR_ALREADY_EXISTS) {
    // 已有實例運行於任一 Session
    ExitProcess(0);
}

註冊 Session 變更通知

需定義 #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。
  • 僅在 Windows XP/Server 2003 以上有效(需 WTSAPI32.dll)。
  • 範例程式在 Win2K 編譯通過,但需 XP 執行才能觀察行為。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved