다음을 통해 공유


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

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

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

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

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

자세한 내용은 실행 시간 연결에 대한 Wtsapi32.dll을 참조하세요.

GetSystemMetrics(SM_REMOTESESSION) 사용하여 애플리케이션이 Windows 8 이상 또는 Windows Server 2012 이상의 원격 세션에서 실행 중인지 또는 원격 세션이 RdP(Microsoft Remote Display Protocol)에 대한 RemoteFX vGPU 개선 사항을 사용할 수 있는지 여부를 확인하면 안 됩니다. 이 경우 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;
}