リモート接続かどうかを取得するには、WTSQuerySessionInformationW()関数に、WTSClientAddressを渡して、WTS_CLIENT_ADDRESS構造体のポインタを取得します。 WTS_CLIENT_ADDRESS構造体の、AddressFamilyメンバーの値がAF_UNSPEC以外の場合は、接続しているクライアントのアドレスが取得できているので、リモート接続中と判断できます。
#include <tchar.h> #include <iostream> #include <windows.h> #include <wtsapi32.h> // lib #pragma comment( lib, "wtsapi32.lib" ) /* リモート接続かどうかを取得する */ BOOL IsRemoteSession ( ) { // リモート接続フラグ BOOL bRemoteSession = FALSE; WTS_CLIENT_ADDRESS* pClientAddress = NULL; DWORD dwBytes = 0; // 指定したターミナルサーバー上の、指定したセッションの情報を取得 if ( 0 != ::WTSQuerySessionInformationW( WTS_CURRENT_SERVER_HANDLE // アプリケーションを実行中のターミナルサーバー , WTS_CURRENT_SESSION // カレントセッション , WTSClientAddress , (LPWSTR*)&pClientAddress , &dwBytes ) ) { if ( NULL != pClientAddress ) { // AF_UNSPEC以外だったらリモート接続 if ( AF_UNSPEC != pClientAddress->AddressFamily ) { // リモート接続でした bRemoteSession = TRUE; } // メモリの解放 ::WTSFreeMemory( pClientAddress ); } } // リモート接続かどうかを返す return( bRemoteSession ); } /* リモート接続かどうかを取得する */ int _tmain ( int argc , _TCHAR* argv[] ) { // 標準出力にユニコードを表示できるようにする setlocale( LC_ALL, "Japanese" ); /* リモート接続かどうかを取得する */ if ( FALSE != IsRemoteSession() ) { std::wcout << L"リモート接続でした。" << std::endl; } else { std::wcout << L"リモート接続ではありませんでした。" << std::endl; } // 処理結果を返す return 0; }
リモート接続でした。