Condividi tramite


Rilevamento dell'ambiente Servizi Desktop remoto

Per ottimizzare le prestazioni, è consigliabile che le applicazioni rilevino se sono in esecuzione in una sessione client di Servizi Desktop remoto. Ad esempio, quando un'applicazione è in esecuzione in una sessione remota, deve eliminare gli effetti grafici non necessari, come descritto in Effetti grafici. Se l'utente esegue l'applicazione in un ambiente locale, non è fondamentale per l'applicazione ottimizzarne il comportamento.

Nell'esempio seguente viene illustrata una funzione che restituisce TRUE se l'applicazione è in esecuzione in una sessione remota e FALSE se l'applicazione è in esecuzione nella console.

#include <windows.h>
#pragma comment(lib, "user32.lib")

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

Per altre informazioni, vedere Run-time Linking to Wtsapi32.dll.

Non usare GetSystemMetrics(SM_REMOTESESSION) per determinare se l'applicazione è in esecuzione in una sessione remota in Windows 8 e versioni successive o successive o Windows Server 2012 e versioni successive se la sessione remota potrebbe usare anche i miglioramenti della vGPU RemoteFX al protocollo RDP (Microsoft Remote Display Protocol). In questo caso, GetSystemMetrics(SM_REMOTESESSION) identificherà la sessione remota come sessione locale.

L'applicazione può controllare la chiave del Registro di sistema seguente per determinare se la sessione è una sessione remota che usa RemoteFX vGPU. Se esiste una sessione locale, questa chiave del Registro di sistema fornisce l'ID della sessione locale.

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\GlassSessionId

Se l'ID della sessione corrente in cui l'applicazione è in esecuzione è uguale a quella della chiave del Registro di sistema, l'applicazione viene eseguita in una sessione locale. Le sessioni identificate come sessione remota in questo modo includono sessioni remote che usano RemoteFX vGPU. Nel codice di esempio seguente viene illustrata questa operazione.

#define TERMINAL_SERVER_KEY _T("SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\")
#define GLASS_SESSION_ID    _T("GlassSessionId")

BOOL
IsCurrentSessionRemoteable()
{
    BOOL fIsRemoteable = FALSE;
                                       
    if (GetSystemMetrics(SM_REMOTESESSION)) 
    {
        fIsRemoteable = TRUE;
    }
    else
    {
        HKEY hRegKey = NULL;
        LONG lResult;

        lResult = RegOpenKeyEx(
            HKEY_LOCAL_MACHINE,
            TERMINAL_SERVER_KEY,
            0, // ulOptions
            KEY_READ,
            &hRegKey
            );

        if (lResult == ERROR_SUCCESS)
        {
            DWORD dwGlassSessionId;
            DWORD cbGlassSessionId = sizeof(dwGlassSessionId);
            DWORD dwType;

            lResult = RegQueryValueEx(
                hRegKey,
                GLASS_SESSION_ID,
                NULL, // lpReserved
                &dwType,
                (BYTE*) &dwGlassSessionId,
                &cbGlassSessionId
                );

            if (lResult == ERROR_SUCCESS)
            {
                DWORD dwCurrentSessionId;

                if (ProcessIdToSessionId(GetCurrentProcessId(), &dwCurrentSessionId))
                {
                    fIsRemoteable = (dwCurrentSessionId != dwGlassSessionId);
                }
            }
        }

        if (hRegKey)
        {
            RegCloseKey(hRegKey);
        }
    }

    return fIsRemoteable;
}