Share via


Détection de l’environnement des services Bureau à distance

Pour optimiser les performances, il est recommandé pour les applications de détecter si elles s’exécutent dans une session cliente des services Bureau à distance. Par exemple, lorsqu’une application s’exécute sur une session distante, elle doit éliminer les effets graphiques inutiles, comme décrit dans Effets graphiques. Si l’utilisateur exécute l’application dans un environnement local, il n’est pas aussi essentiel pour l’application d’optimiser son comportement.

L’exemple suivant montre une fonction qui retourne TRUE si l’application s’exécute dans une session distante et FALSE si l’application s’exécute sur la console.

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

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

Pour plus d’informations, consultez Liaison au moment de l’exécution vers Wtsapi32.dll.

Vous ne devez pas utiliser GetSystemMetrics(SM_REMOTESESSION) pour déterminer si votre application s’exécute dans une session à distance dans Windows 8 et versions ultérieures ou Windows Server 2012 et versions ultérieures si la session distante peut également utiliser les améliorations apportées au protocole RDP (Remote Display Protocol) de RemoteFX. Dans ce cas, GetSystemMetrics(SM_REMOTESESSION) identifie la session distante en tant que session locale.

Votre application peut case activée la clé de Registre suivante pour déterminer si la session est une session distante qui utilise le vGPU RemoteFX. S’il existe une session locale, cette clé de Registre fournit l’ID de la session locale.

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

Si l’ID de la session active dans laquelle l’application s’exécute est le même que dans la clé de Registre, l’application s’exécute dans une session locale. Les sessions identifiées comme étant des sessions à distance de cette façon incluent les sessions à distance qui utilisent le processeur virtuel RemoteFX. C'est ce que montre l'exemple de code suivant.

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