24

プログラムがリモートデスクトップ(ターミナルサービス)で実行されているかどうかを判断する方法はありますか?

プログラムがリモートデスクトップセッションで実行されているときに、プログラムで「非アクティブタイムアウト」を有効にしたいのですが。ユーザーはリモートデスクトップセッションを開いたままにしておくことで悪名高いので、指定した非アクティブ期間の後にプログラムを終了させたいと思います。ただし、RD以外のユーザーに対して非アクティブタイムアウトを有効にしたくありません。

4

3 に答える 3

20

GetSystemMetrics(SM_REMOTESESSION) ( http://msdn.microsoft.com/en-us/library/aa380798.aspxで説明)

于 2008-10-01T21:53:17.097 に答える
13

私が使用する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;
    }
}
于 2008-10-27T19:46:01.663 に答える
6

あなたのセッションで実行されているあなたのアプリケーションについて知りたい場合は、次のように機能します。

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);
}
于 2010-05-04T14:28:35.973 に答える