Поделиться через


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

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

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

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

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

Если идентификатор текущего сеанса, в котором выполняется приложение, совпадает с ключом реестра, приложение выполняется в локальном сеансе. Сеансы, определенные как удаленный сеанс таким образом, включают удаленные сеансы, использующие виртуальный ЦП 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;
}