Как узнать, работает ли мое приложение в сеансе RDP

У меня есть приложение .net winforms, в котором есть несколько эффектов анимации, постепенное исчезновение, анимация прокрутки и т. Д. Они работают нормально, однако, если я нахожусь в сеансе протокола удаленного рабочего стола, анимация начинает раздражаться.

Может ли кто-нибудь предложить способ определить, работает ли приложение в сеансе RDP, чтобы я мог отключить эффекты в этом случае?


person Christopher Edwards    schedule 17.11.2008    source источник


Ответы (4)


Предполагая, что вы хотя бы используете .NET Framework 2.0, нет необходимости использовать P / Invoke: просто проверьте значение System.Windows.Forms.SystemInformation.TerminalServerSession (MSDN).

person Arnout    schedule 17.11.2008

См. Аналогичный вопрос, который я задал: Как проверить, работает от аккумулятора?

Потому что, если вы работаете от батареи, вы также хотите отключить анимацию.

/// <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;    
    }
}

А затем, чтобы проверить, работает ли вы от батареи:

/// <summary>
/// Indicates if we're running on battery power.
/// If we are, then disable CPU wasting things like animations, background operations, network, I/O, etc
/// </summary>
public static Boolean IsRunningOnBattery
{
   get
   {
      PowerLineStatus pls = System.Windows.Forms.SystemInformation.PowerStatus.PowerLineStatus;
      if (pls == PowerLineStatus.Offline)
      {
         //Offline means running on battery
         return true;
      }
      else
      {
         return false;
      }
   }
}

Что вы можете просто объединить в одно:

public Boolean UseAnimations()
{
   return 
      (!System.Windows.Forms.SystemInformation.TerminalServerSession) &&
      (System.Windows.Forms.SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Offline);
}

Примечание. Этот вопрос уже задавался (Определить, работает ли программа на удаленном рабочем столе)

person Ian Boyd    schedule 16.12.2008

В дополнение к первоначальной проверке, чтобы увидеть, работает ли ваш рабочий стол в сеансе RDP, вы также можете обработать ситуацию, когда удаленный сеанс подключается или отключается во время работы вашего ap. У вас может быть приложение, работающее в сеансе консоли, а затем кто-то может инициировать RDP-соединение с консолью. Если ваше приложение периодически не вызывает GetSystemMetrics, оно будет предполагать, что оно не работает как сеанс терминальных служб.

Ваше приложение будет регистрироваться для уведомлений об обновлении сеанса через WTSRegisterSessionNotification. Это позволит немедленно уведомить ваше приложение об открытии или закрытии удаленного соединения с сеансом рабочего стола, в котором работает ваше приложение. Пример C # см. здесь код.

Хороший пример кода Delphi Win32 для использования WTSRegisterSessionNotification можно найти на странице .

person Chris Miller    schedule 16.12.2008

Используйте функцию GetSystemMetrics () в user32.dll. Для его вызова используйте PInvoke. Ниже приведен пример кода, предоставленного по первой ссылке. Вторая ссылка говорит вам, как вызвать его в .NET.

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

Полный код:

[DllImport("User32.dll")]
static extern Boolean IsRemoteSession()
{
 return GetSystemMetrics ( SM_REMOTESESSION);
}

Также есть свойство SystemInformation.TerminalServerSession, которое определяет, подключен ли клиент к сеансу сервера терминалов. Предоставлен код от MSDN обширен, поэтому я не буду его здесь дублировать.

person George Stocker    schedule 17.11.2008
comment
Обратите внимание, что TerminalServerSession - это просто оболочка для вызова GetSystemMetrics(SM_REMOTESESSION). - person Cameron; 17.05.2014