わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。

リモート接続かどうかを取得する

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



実行結果

リモート接続でした。






わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。