.net - son - ¿Cómo puedo saber si mi aplicación se está ejecutando en una sesión de RDP?
mantener aplicaciones en segundo plano android (4)
Tengo una aplicación de .NET winforms que tiene algunos efectos de animación, fundidos de entrada y animaciones de desplazamiento, etc. Funcionan bien; sin embargo, si estoy en una sesión de Protocolo de escritorio remoto, las animaciones comienzan a agradar.
¿Puede alguien 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?
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 en la que la sesión remota está conectada o desconectada mientras se ejecuta su ap. 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.
Haría que su aplicación se registrase para notificaciones de actualización de 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. Vea aquí para ver un ejemplo de código C #.
Para obtener un buen código de examen Delphi Win32 para usar WTSRegisterSessionNotification, consulte esta página .
Use 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 está la propiedad SystemInformation.TerminalServerSession
, que determina si el cliente está conectado o no a una sesión de Terminal Server. El código proporcionado por MSDN es extenso, así que no lo duplicaré aquí.
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 ).
Ver una pregunta similar que hice: ¿Cómo comprobar si estamos funcionando con batería?
Porque si está utilizando la batería, también quiere deshabilitar las 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 luego para verificar si está funcionando con 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;
}
}
}
Lo cual puedes combinar en uno:
public Boolean UseAnimations()
{
return
(!System.Windows.Forms.SystemInformation.TerminalServerSession) &&
(System.Windows.Forms.SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Offline);
}
Nota: Esta pregunta ya fue hecha ( Determine si un programa se está ejecutando en un escritorio remoto )