Freigeben über


Erkennen der Remotedesktopdienste-Umgebung

Um die Leistung zu optimieren, empfiehlt es sich, dass Anwendungen erkennen, ob sie in einer Remotedesktopdienste-Clientsitzung ausgeführt werden. Wenn eine Anwendung beispielsweise in einer Remotesitzung ausgeführt wird, sollte sie unnötige Grafikeffekte vermeiden, wie unter Grafikeffekte beschrieben. Wenn der Benutzer die Anwendung in einer lokalen Umgebung ausführt, ist es für die Anwendung nicht so wichtig, ihr Verhalten zu optimieren.

Das folgende Beispiel zeigt eine Funktion, die TRUE zurückgibt, wenn die Anwendung in einer Remotesitzung ausgeführt wird, und FALSE , wenn die Anwendung auf der Konsole ausgeführt wird.

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

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

Weitere Informationen finden Sie unter Laufzeitverknüpfung mit Wtsapi32.dll.

Sie sollten GetSystemMetrics(SM_REMOTESESSION) nicht verwenden, um zu bestimmen, ob Ihre Anwendung in einer Remotesitzung in Windows 8 und höher ausgeführt wird, oder Windows Server 2012 und später, wenn die Remotesitzung möglicherweise auch die RemoteFX vGPU-Verbesserungen des Microsoft Remote Display Protocol (RDP) verwendet. In diesem Fall identifiziert GetSystemMetrics(SM_REMOTESESSION) die Remotesitzung als lokale Sitzung.

Ihre Anwendung kann den folgenden Registrierungsschlüssel überprüfen, um festzustellen, ob es sich bei der Sitzung um eine Remotesitzung handelt, die RemoteFX vGPU verwendet. Wenn eine lokale Sitzung vorhanden ist, stellt dieser Registrierungsschlüssel die ID der lokalen Sitzung bereit.

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

Wenn die ID der aktuellen Sitzung, in der die Anwendung ausgeführt wird, mit der id des Registrierungsschlüssels identisch ist, wird die Anwendung in einer lokalen Sitzung ausgeführt. Sitzungen, die auf diese Weise als Remotesitzung identifiziert werden, umfassen Remotesitzungen, die RemoteFX vGPU verwenden. Dies wird im folgenden Beispielcode veranschaulicht.

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