Share via


Detectando o ambiente dos Serviços de Área de Trabalho Remota

Para otimizar o desempenho, é uma boa prática que os aplicativos detectem se estão em execução em uma sessão de cliente dos Serviços de Área de Trabalho Remota. Por exemplo, quando um aplicativo está em execução em uma sessão remota, ele deve eliminar efeitos gráficos desnecessários, conforme descrito em Efeitos Gráficos. Se o usuário estiver executando o aplicativo em um ambiente local, ele não será tão crítico para o aplicativo otimizar seu comportamento.

O exemplo a seguir mostra uma função que retornará TRUE se o aplicativo estiver em execução em uma sessão remota e FALSE se o aplicativo estiver em execução no console.

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

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

Para obter mais informações, consulte Vinculação em tempo de execução ao Wtsapi32.dll.

Você não deve usar GetSystemMetrics(SM_REMOTESESSION) para determinar se o aplicativo está em execução em uma sessão remota no Windows 8 e posterior ou Windows Server 2012 e posterior se a sessão remota também pode estar usando os aprimoramentos de vGPU do RemoteFX para o PROTOCOLO RDP. Nesse caso, GetSystemMetrics(SM_REMOTESESSION) identificará a sessão remota como uma sessão local.

Seu aplicativo pode marcar a chave do Registro a seguir para determinar se a sessão é uma sessão remota que usa o vGPU do RemoteFX. Se existir uma sessão local, essa chave do Registro fornecerá a ID da sessão local.

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

Se a ID da sessão atual na qual o aplicativo está sendo executado for a mesma que na chave do Registro, o aplicativo será executado em uma sessão local. As sessões identificadas como sessão remota dessa forma incluem sessões remotas que usam vGPU RemoteFX. O código de exemplo a seguir demonstra isso.

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