Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Чтобы оптимизировать производительность, рекомендуется определить, работают ли они в клиентском сеансе служб удаленных рабочих столов. Например, если приложение работает в удаленном сеансе, оно должно исключить ненужные графические эффекты, как это описано в 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;
}