Determina se un programma è in esecuzione su un desktop remoto
-
03-07-2019 - |
Domanda
Esiste un modo in cui il mio programma può determinare quando è in esecuzione su un Desktop remoto (Servizi terminal)?
Vorrei abilitare un "timeout di inattività" sul programma quando è in esecuzione su una sessione di Desktop remoto. Poiché gli utenti sono noti per lasciare aperte le sessioni di Desktop remoto, desidero che il mio programma termini dopo un determinato periodo di inattività. Ma non voglio che il timeout di inattività sia abilitato per gli utenti non RD.
Soluzione
GetSystemMetrics (SM_REMOTESESSION) (come descritto in http://msdn.microsoft. com / it-it / library / aa380798.aspx )
Altri suggerimenti
Ecco il codice gestito C # che utilizzo:
/// <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;
}
}
Se vuoi sapere della TUA applicazione che è in esecuzione nella TUA sessione, funziona quanto segue:
BOOL IsRemoteSession(void)
{
return GetSystemMetrics( SM_REMOTESESSION );
}
Ma non in generale per qualsiasi ID processo.
Se vuoi conoscere qualsiasi processo arbitrario che potrebbe essere in esecuzione in qualsiasi sessione arbitraria, puoi utilizzare il metodo seguente.
Puoi prima convertire l'ID processo in un ID sessione chiamando ProcessIdToSessionId . Una volta che hai l'ID sessione, puoi usarlo per chiamare: WTSQuerySessionInformation . Puoi specificare WTSInfoClass
come valore WTSIsRemoteSession
e questo ti darà le informazioni sul fatto se l'applicazione è una connessione desktop remoto o meno.
BOOL IsRemoteSession(DWORD sessionID)
{
//In case WTSIsRemoteSession is not defined for you it is value 29
return WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, sessionID, WTSIsRemoteSession, NULL, NULL);
}