다음을 통해 공유


원격 데스크톱 서비스 환경 검색

성능을 최적화하려면 애플리케이션이 원격 데스크톱 서비스 클라이언트 세션에서 실행 중인지 여부를 검색하는 것이 좋습니다. 예를 들어 애플리케이션이 원격 세션에서 실행되는 경우 그래픽 효과에 설명된 대로 불필요한 그래픽 효과를 제거해야 합니다. 사용자가 로컬 환경에서 애플리케이션을 실행하는 경우 애플리케이션의 동작을 최적화하는 것은 중요하지 않습니다.

다음 예제에서는 애플리케이션이 원격 세션에서 실행되는 경우 TRUE 를 반환하고, 애플리케이션이 콘솔에서 실행 중인 경우 FALSE 를 반환하는 함수를 보여줍니다.

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

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

자세한 내용은 런타임 Wtsapi32.dll연결을 참조하세요.

GetSystemMetrics(SM_REMOTESESSION)를 사용하여 원격 세션이 RDP(Microsoft Remote Display Protocol)에 대한 RemoteFX vGPU 개선 사항을 사용할 수 있는지 여부와 Windows 8 이상 또는 Windows Server 2012 이상의 원격 세션에서 애플리케이션이 실행 중인지 여부를 결정해서는 안 됩니다. 이 경우 GetSystemMetrics(SM_REMOTESESSION) 는 원격 세션을 로컬 세션으로 식별합니다.

애플리케이션은 다음 레지스트리 키를 검사 세션이 RemoteFX vGPU를 사용하는 원격 세션인지 여부를 확인할 수 있습니다. 로컬 세션이 있는 경우 이 레지스트리 키는 로컬 세션의 ID를 제공합니다.

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

애플리케이션이 실행 중인 현재 세션의 ID가 레지스트리 키와 동일한 경우 애플리케이션은 로컬 세션에서 실행됩니다. 이러한 방식으로 원격 세션으로 식별되는 세션에는 RemoteFX vGPU를 사용하는 원격 세션이 포함됩니다. 다음 샘플 코드에서는 이를 보여 줍니다.

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