Обнаружение среды служб удаленных рабочих столов

Чтобы оптимизировать производительность, рекомендуется, чтобы приложения обнаруживали, выполняются ли они в сеансе клиента Служб удаленных рабочих столов. Например, если приложение выполняется в удаленном сеансе, оно должно исключить ненужные графические эффекты, как описано в разделе Графические эффекты. Если пользователь запускает приложение в локальной среде, для него не так важно оптимизировать его поведение.

В следующем примере показана функция, которая возвращает значение 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 и более поздних версий, а также может ли удаленный сеанс использовать усовершенствования vGPU RemoteFX для протокола удаленного отображения (RDP). В этом случае GetSystemMetrics(SM_REMOTESESSION) определит удаленный сеанс как локальный.

Приложение может проверка следующий раздел реестра, чтобы определить, является ли сеанс удаленным сеансом, использующим vGPU RemoteFX. Если локальный сеанс существует, этот раздел реестра предоставляет идентификатор локального сеанса.

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

Если идентификатор текущего сеанса, в котором выполняется приложение, совпадает с идентификатором в разделе реестра, приложение выполняется в локальном сеансе. Сеансы, идентифицированные таким образом как удаленный сеанс, включают удаленные сеансы, использующие vGPU RemoteFX. Это показано в следующем образце кода.

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