Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Для какого-то хорошего кода проверки Delphi Win32 для использования WTSRegisterSessionNotification см. эту страницу.

Ответ 4

Используйте 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, обширен, поэтому я не буду дублировать его здесь.