リモート接続かどうかを取得するには、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;
}
リモート接続でした。