WinXP の簡易ユーザー切り替えを検知する |
ダウンロード : WinXP簡易ユーザー切り替え検知プログラムサンプル(2007/11/17) |
// --------------------------------------------------------------------- // セッションの切り替え通知の受け取りを登録する // dwFlag = NOTIFY_FOR_THIS_SESSION : 自分の情報のみ受け取る // NOTIFY_FOR_ALL_SESSIONS : 全ての情報を受け取る // --------------------------------------------------------------------- BOOL CTestUserStatusApp::WTSRegisterSessionNotification( HWND hWnd, // ウィンドウハンドル DWORD dwFlag // 通知受け取りフラグ ) { BOOL bSuccess = FALSE; // 通知ウィンドウを登録する(動的リンク呼び出し) HINSTANCE hDLL = ::LoadLibrary(_T("WTSAPI32.DLL")); if (hDLL) { typedef BOOL (__stdcall *WTSFUNC)(HWND, DWORD); WTSFUNC pWTSRegSession = (WTSFUNC)::GetProcAddress( hDLL, _T("WTSRegisterSessionNotification") ); if (pWTSRegSession) { bSuccess = pWTSRegSession(hWnd, dwFlag); } ::FreeLibrary(hDLL); } return bSuccess; } |
#include <Wtsapi32.h> #include <Lmcons.h> // --------------------------------------------------------------------- // セッション変更通知メッセージの定義 // --------------------------------------------------------------------- #define WM_WTSSESSION_CHANGE 0x02B1 #define WTS_CONSOLE_CONNECT 0x1 #define WTS_CONSOLE_DISCONNECT 0x2 #define WTS_REMOTE_CONNECT 0x3 #define WTS_REMOTE_DISCONNECT 0x4 #define WTS_SESSION_LOGON 0x5 #define WTS_SESSION_LOGOFF 0x6 #define WTS_SESSION_LOCK 0x7 #define WTS_SESSION_UNLOCK 0x8 #define WTS_SESSION_REMOTE_CONTROL 0x9 |
WTS_CONSOLE_CONNECT | : | コンソールセッションが接続された |
WTS_CONSOLE_DISCONNECT | : | コンソールセッションが切断された |
WTS_REMOTE_CONNECT | : | リモートセッションが接続された |
WTS_REMOTE_DISCONNECT | : | リモートセッションが切断された |
WTS_SESSION_LOGON | : | ユーザがログオンした |
WTS_SESSION_LOGOFF | : | ユーザがログオフした |
WTS_SESSION_LOCK | : | セッションがロックされた |
WTS_SESSION_UNLOCK | : | セッションがアンロックされた |
WTS_SESSION_REMOTE_CONTROL | : | リモート制御状態のセッションが変更された |
// --------------------------------------------------------------------- // CTestUserStatusView メッセージマップ // --------------------------------------------------------------------- BEGIN_MESSAGE_MAP(CTestUserStatusView, CScrollView) ON_WM_CREATE() ON_WM_DESTROY() ON_MESSAGE(WM_WTSSESSION_CHANGE, OnWtsSessionChange) // 追加 END_MESSAGE_MAP() // --------------------------------------------------------------------- // セッションの状態が変更された // --------------------------------------------------------------------- LRESULT CTestUserStatusView::OnWtsSessionChange(WPARAM wParam, LPARAM lParam) { DWORD dwId = (DWORD)lParam; switch (wParam) { case WTS_CONSOLE_CONNECT: OnWtsConsoleConnect(dwId); break; case WTS_CONSOLE_DISCONNECT: OnWtsConsoleDisconnect(dwId); break; case WTS_REMOTE_CONNECT: OnWtsRemoteConnect(dwId); break; case WTS_REMOTE_DISCONNECT: OnWtsRemoteDisconnect(dwId); break; case WTS_SESSION_LOGON: OnWtsSessionLogOn(dwId); break; case WTS_SESSION_LOGOFF: OnWtsSessionLogOff(dwId); break; case WTS_SESSION_LOCK: OnWtsSessionLock(dwId); break; case WTS_SESSION_UNLOCK: OnWtsSessionUnlock(dwId); break; case WTS_SESSION_REMOTE_CONTROL: OnWtsSessionRemoteControl(dwId); break; } return 0; } |
typedef BOOL (__stdcall *WTSQUERYFUNC)(HANDLE, DWORD, WTS_INFO_CLASS, LPTSTR*, DWORD*); typedef VOID (__stdcall *WTSFREEFUNC)(PVOID); // --------------------------------------------------------------------- // WTSユーザー名を取得する // --------------------------------------------------------------------- CString CTestUserStatusApp::GetWTSUserName(DWORD dwID) { CString strUser; HINSTANCE hDLL = ::LoadLibrary(_T("WTSAPI32.DLL")); if (hDLL) { // WTSQuerySessionInformationA 関数ポインタ動的取得 WTSQUERYFUNC pWTSQuerySessionInformation = (WTSQUERYFUNC)::GetProcAddress( hDLL, _T("WTSQuerySessionInformationA") ); // WTSFreeMemory 関数ポインタ動的取得 WTSFREEFUNC pWTSFreeMemory = (WTSFREEFUNC)::GetProcAddress( hDLL, _T("WTSFreeMemory") ); // ユーザー名を取得する if (pWTSQuerySessionInformation && pWTSFreeMemory) { LPTSTR lpUser =NULL; DWORD dwSize = 0; if (pWTSQuerySessionInformation( WTS_CURRENT_SERVER_HANDLE, dwID, WTSUserName, &lpUser, &dwSize )){ strUser = lpUser; pWTSFreeMemory(lpUser); } } ::FreeLibrary(hDLL); } return strUser; } |
// --------------------------------------------------------------------- // 登録したセッションの切り替え通知登録を解除する // --------------------------------------------------------------------- BOOL CTestUserStatusApp::WTSUnRegisterSessionNotification(HWND hWnd) { BOOL bSuccess = FALSE; // 通知ウィンドウの登録を解除する(動的リンク呼び出し) HINSTANCE hDLL = ::LoadLibrary(_T("WTSAPI32.DLL")); if (hDLL) { typedef BOOL (__stdcall *WTSFUNC)(HWND); WTSFUNC pWTSUnRegSession = (WTSFUNC)::GetProcAddress( hDLL, _T("WTSUnRegisterSessionNotification") ); if (pWTSUnRegSession) { bSuccess = pWTSUnRegSession(hWnd); } ::FreeLibrary(hDLL); } return bSuccess; } |