Определите, работает ли программа на удаленном рабочем столе - PullRequest
23 голосов
/ 02 октября 2008

Есть ли способ, которым моя программа может определить, когда она работает на удаленном рабочем столе (службы терминалов)?

Я бы хотел включить «тайм-аут бездействия» для программы, когда она запускается в сеансе удаленного рабочего стола. Поскольку пользователи известны тем, что они оставляют сеансы удаленного рабочего стола открытыми, я хочу, чтобы моя программа завершала работу после определенного периода бездействия. Но я не хочу, чтобы таймаут неактивности был включен для пользователей без RD.

Ответы [ 3 ]

19 голосов
/ 02 октября 2008

GetSystemMetrics (SM_REMOTESESSION) (как описано в http://msdn.microsoft.com/en-us/library/aa380798.aspx)

12 голосов
/ 27 октября 2008

Вот код 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;
    }
}
5 голосов
/ 04 мая 2010

Следующее работает, если вы хотите знать о ВАШЕМ приложении, которое выполняется в ВАШЕМ сеансе:

BOOL IsRemoteSession(void)
{
   return GetSystemMetrics( SM_REMOTESESSION );
}

Но не для любого идентификатора процесса.


Если вы хотите узнать о любом произвольном процессе, который может выполняться в любом произвольном сеансе, то вы можете использовать следующий метод.

Сначала можно преобразовать идентификатор процесса в идентификатор сеанса, вызвав ProcessIdToSessionId . Когда у вас есть идентификатор сессии, вы можете использовать его для вызова: 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);
}
...