Как узнать, запущено ли мое приложение в сеансе RDP? - PullRequest
18 голосов
/ 17 ноября 2008

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

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

Ответы [ 4 ]

20 голосов
/ 17 ноября 2008

Если вы, по крайней мере, используете .NET Framework 2.0, использовать P / Invoke не нужно: просто проверьте значение System.Windows.Forms.SystemInformation.TerminalServerSession ( MSDN ).

7 голосов
/ 16 декабря 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);
}

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

3 голосов
/ 16 декабря 2008

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...