2008-11-17 30 views
18

Tengo una aplicación .NET winforms que tiene algunos efectos de animación, fundidos de entrada y animaciones de desplazamiento, etc. Sin embargo, funcionan bien si estoy en un protocolo de escritorio remoto sesión las animaciones comienzan a rallar.¿Cómo puedo saber si mi aplicación se está ejecutando en una sesión de RDP

¿Alguien puede sugerir una forma de determinar si una aplicación se está ejecutando o no en una sesión RDP para poder desactivar los efectos en este caso?

Respuesta

20

Suponiendo que esté al menos en .NET Framework 2.0, no es necesario usar P/Invoke: simplemente verifique el valor de System.Windows.Forms.SystemInformation.TerminalServerSession (MSDN).

2

Utilice la función GetSystemMetrics() en user32.dll. Use PInvoke para llamarlo. El siguiente es un código de muestra proporcionado por el primer enlace. El segundo enlace le dice cómo invocarlo en .NET.

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

Código completo:

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

También existe la SystemInformation.TerminalServerSession propiedad, que determina si el cliente está conectado a una sesión de Terminal Server. El code provided de MSDN es extenso, así que no lo duplicaré aquí.

+1

Tenga en cuenta que 'TerminalServerSession' es simplemente un contenedor de una llamada a' GetSystemMetrics (SM_REMOTESESSION) '. – Cameron

3

Además de realizar la comprobación inicial para ver si su escritorio se está ejecutando en una sesión RDP, es posible que también desee manejar la situación donde la sesión remota está conectada o desconectada mientras su aplicación se está ejecutando. Podría tener una aplicación ejecutándose en la sesión de la consola y luego alguien podría iniciar una conexión RDP a la consola. A menos que su aplicación haga la llamada periódicamente a GetSystemMetrics, asumirá que no se está ejecutando como una sesión de servicios de terminal.

Debería hacer que su aplicación se registre para notificar las actualizaciones de la sesión a través de WTSRegisterSessionNotification. Esto permitirá que se notifique inmediatamente a su aplicación si se ha abierto o cerrado una conexión remota a la sesión de escritorio en la que se ejecuta la aplicación. Ver here para ver un código C# de muestra.

Para obtener un buen código de examen Delphi Win32 para usar WTSRegisterSessionNotification, consulte este page.

7

Ver una pregunta similar le pregunté: How to check if we’re running on battery?

Porque si se está ejecutando en la batería también desea desactivar animaciones.

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

Y a continuación, para comprobar si se está ejecutando en la batería:

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

cual sólo se puede combinar en una sola:

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

Nota: Esta pregunta ya se le preguntó (Determine if a program is running on a Remote Desktop)

Cuestiones relacionadas