Udostępnij za pośrednictwem


Wykrywanie środowiska usług pulpitu zdalnego

Aby zoptymalizować wydajność, dobrym rozwiązaniem jest wykrywanie, czy aplikacje są uruchomione w sesji klienta usług pulpitu zdalnego. Na przykład gdy aplikacja jest uruchomiona w sesji zdalnej, powinna wyeliminować niepotrzebne efekty graficzne, zgodnie z opisem w Graphic Effects. Jeśli użytkownik uruchamia aplikację w środowisku lokalnym, nie jest tak istotne dla aplikacji, aby optymalizować jej działanie.

W poniższym przykładzie przedstawiono funkcję zwracającą PRAWDA, jeśli aplikacja jest uruchomiona w sesji zdalnej, i FAŁSZ, jeśli aplikacja jest uruchomiona na konsoli.

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

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

Aby uzyskać więcej informacji, zobacz Łączenie w czasie wykonywania z Wtsapi32.dll.

Nie należy używać GetSystemMetrics(SM_REMOTESESSION), aby określić, czy aplikacja jest uruchomiona w sesji zdalnej w systemie Windows 8 i nowszych lub Windows Server 2012 i nowszych, jeśli sesja zdalna może również używać ulepszeń RemoteFX vGPU do protokołu RDP (Remote Display Protocol). W takim przypadku GetSystemMetrics(SM_REMOTESESSION) zidentyfikuje sesję zdalną jako sesję lokalną.

Aplikacja może sprawdzić następujący klucz rejestru, aby określić, czy sesja jest sesją zdalną korzystającą z funkcji RemoteFX vGPU. Jeśli sesja lokalna istnieje, ten klucz rejestru zawiera identyfikator sesji lokalnej.

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

Jeśli identyfikator bieżącej sesji, w której aplikacja jest uruchomiona, jest taki sam jak w kluczu rejestru, aplikacja jest uruchomiona w sesji lokalnej. Sesje zidentyfikowane jako sesja zdalna w ten sposób obejmują sesje zdalne korzystające z funkcji RemoteFX vGPU. Poniższy przykładowy kod pokazuje to.

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