windows 使用者登入和登出監控|windows session 狀態改變監控
不知道大家注意到沒有,Windows XP新增加了一個快速切換使用者的功能。它可以讓您在不登出的情況下在使用者之間進行切換,而且每個使用者有自己獨立的配置檔案和桌面。也就是說當您切換到另外 一個使用者(即用另外一個賬號登陸)時,以前的那個使用者執行的所有程式都還是在執行的,並沒有退出來。這就給我們的開發帶來了新的問題。比如您的應用程式提 供的功能在多個使用者同時執行時發生錯誤,您必須為應用程式新增程式碼以檢測該情形並作出相應的反應。
1、檢測是否有使用者正在執行該應用程式
我們平時都使用互斥體的方法來實現只有一個例項執行,而且在使用CreateMutex()生成互斥體是使用預設的方式,即互斥體的作用範圍不是全域性 的,只能在一個Session裡起作用,而對於切換使用者下存在多個Session是不起作用的,因而也就檢測不到已經在執行的例項。解決的方法很簡單,在 使用CreateMutex()時,在互斥體的名字前加上"Global"關鍵字即可。
m_hMutexAppRunning = CreateMutex(NULL, FALSE, "Global\\EsXPSwitchUserApp");
2、監測使用者現在是否在切換使用者有的時候,我們需要檢測使用者做切換使用者操作的這個行為,以便讓我們的程式能夠做出相應的處理。
例如,我們需要在結束活動 使用者會話執行狀態時釋放某些資源,而在其再次進入活動會話狀態時重新獲得該資源。還好Microsoft提供了讓我們的程式接收會話通知訊息的方法。我們 可以通過呼叫WTSRegisterSessionNotification 函式進行註冊以接收WM_WTSSESSION_CHANGE 訊息。
這些訊息主要有:
WTS_CONSOLE_CONNECT
WTS_CONSOLE_DISCONNECT
WTS_REMOTE_CONNECT
WTS_REMOTE_DISCONNECT
WTS_SESSION_LOGON
WTS_SESSION_LOGOFF
WTS_SESSION_LOCK
WTS_SESSION_UNLOCK
在wParam中包含了這些訊息型別,而lParam包含的是發生變化的Session的SessionID.
switch(message)
{
case WM_WTSSESSION_CHANGE:
{
switch(wParam)
{
case WTS_CONSOLE_CONNECT:
MessageBox("WTS_CONSOLE_CONNECT", "Esmile", MB_OK );
break;
case WTS_CONSOLE_DISCONNECT:
MessageBox("WTS_CONSOLE_DISCONNECT",
"Esmile", MB_OK );
break;
case WTS_SESSION_LOCK:
MessageBox("WTS_SESSION_LOCK",
"Esmile", MB_OK );
break;
case WTS_SESSION_UNLOCK:
MessageBox("WTS_SESSION_UNLOCK",
"Esmile", MB_OK );
break;
case WTS_SESSION_LOGOFF:
MessageBox("WTS_SESSION_LOGOFF",
"Esmile", MB_OK );
break;
case WTS_SESSION_LOGON:
MessageBox("WTS_SESSION_LOGON",
"Esmile", MB_OK );
break;
default:
break;
}
}
break;
default:
break;
}
這樣,我們就可以處理我們感興趣的訊息了,從而達到我們的目的.
3、注意事項
每一個對 WTSRegisterSessionNotification 的呼叫應與一個對 WTSUnRegisterSessionNotification 的呼叫匹配,
即在程式退出時要釋放這個通知註冊資訊。
WTSRegisterSessionNotification 和 WTSUnRegisterSessionNotification 需要標頭檔案Wtsapi32.h以及
Wtsapi32.lib。另外在包含 windows.h 的語句之前新增以下 #define 語句
#define _WIN32_WINNT 0x0501
文章附帶的原始碼在win2000pro下編譯通過,程式只能在Window XP下執行,因為非XP系統沒有WTSAPI32.dll。