Wykrywanie środowiska usług pulpitu zdalnego
Aby zoptymalizować wydajność, dobrym rozwiązaniem jest wykrywanie, czy aplikacje są uruchomione w sesji klienta usług pulpitu zdalnego. Na przykład gdy aplikacja jest uruchomiona w sesji zdalnej, powinna wyeliminować niepotrzebne efekty graficzne, zgodnie z opisem w Graphic Effects. Jeśli użytkownik uruchamia aplikację w środowisku lokalnym, nie jest tak istotne dla aplikacji, aby optymalizować jej działanie.
W poniższym przykładzie przedstawiono funkcję zwracającą PRAWDA, jeśli aplikacja jest uruchomiona w sesji zdalnej, i FAŁSZ, jeśli aplikacja jest uruchomiona na konsoli.
#include <windows.h>
#pragma comment(lib, "user32.lib")
BOOL IsRemoteSession(void)
{
return GetSystemMetrics( SM_REMOTESESSION );
}
Aby uzyskać więcej informacji, zobacz Łączenie w czasie wykonywania z Wtsapi32.dll.
Nie należy używać GetSystemMetrics(SM_REMOTESESSION), aby określić, czy aplikacja jest uruchomiona w sesji zdalnej w systemie Windows 8 i nowszych lub Windows Server 2012 i nowszych, jeśli sesja zdalna może również używać ulepszeń RemoteFX vGPU do protokołu RDP (Remote Display Protocol). W takim przypadku GetSystemMetrics(SM_REMOTESESSION) zidentyfikuje sesję zdalną jako sesję lokalną.
Aplikacja może sprawdzić następujący klucz rejestru, aby określić, czy sesja jest sesją zdalną korzystającą z funkcji RemoteFX vGPU. Jeśli sesja lokalna istnieje, ten klucz rejestru zawiera identyfikator sesji lokalnej.
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\GlassSessionId
Jeśli identyfikator bieżącej sesji, w której aplikacja jest uruchomiona, jest taki sam jak w kluczu rejestru, aplikacja jest uruchomiona w sesji lokalnej. Sesje zidentyfikowane jako sesja zdalna w ten sposób obejmują sesje zdalne korzystające z funkcji RemoteFX vGPU. Poniższy przykładowy kod pokazuje to.
#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;
}