プログラムがリモートデスクトップ(ターミナルサービス)で実行されているかどうかを判断する方法はありますか?
プログラムがリモートデスクトップセッションで実行されているときに、プログラムで「非アクティブタイムアウト」を有効にしたいのですが。ユーザーはリモートデスクトップセッションを開いたままにしておくことで悪名高いので、指定した非アクティブ期間の後にプログラムを終了させたいと思います。ただし、RD以外のユーザーに対して非アクティブタイムアウトを有効にしたくありません。
プログラムがリモートデスクトップ(ターミナルサービス)で実行されているかどうかを判断する方法はありますか?
プログラムがリモートデスクトップセッションで実行されているときに、プログラムで「非アクティブタイムアウト」を有効にしたいのですが。ユーザーはリモートデスクトップセッションを開いたままにしておくことで悪名高いので、指定した非アクティブ期間の後にプログラムを終了させたいと思います。ただし、RD以外のユーザーに対して非アクティブタイムアウトを有効にしたくありません。
GetSystemMetrics(SM_REMOTESESSION) ( http://msdn.microsoft.com/en-us/library/aa380798.aspxで説明)
私が使用するC#マネージコードは次のとおりです。
/// <summary>
/// Indicates if we're running in a remote desktop session.
/// If we are, then you MUST disable animations and double buffering i.e. Pay your taxes!
///
/// </summary>
/// <returns></returns>
public static Boolean IsRemoteSession
{
//This is just a friendly wrapper around the built-in way
get
{
return System.Windows.Forms.SystemInformation.TerminalServerSession;
}
}
あなたのセッションで実行されているあなたのアプリケーションについて知りたい場合は、次のように機能します。
BOOL IsRemoteSession(void)
{
return GetSystemMetrics( SM_REMOTESESSION );
}
ただし、一般的にはプロセス ID ではありません。
任意のセッションで実行されている可能性のある任意のプロセスについて知りたい場合は、以下の方法を使用できます。
まず、 ProcessIdToSessionIdを呼び出して、プロセス ID をセッション ID に変換できます。セッション ID を取得したら、それを使用してWTSQuerySessionInformationを呼び出すことができます。WTSInfoClass
値として指定するWTSIsRemoteSession
と、そのアプリケーションがリモート デスクトップ接続であるかどうかに関する情報が得られます。
BOOL IsRemoteSession(DWORD sessionID)
{
//In case WTSIsRemoteSession is not defined for you it is value 29
return WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, sessionID, WTSIsRemoteSession, NULL, NULL);
}