Identifiera miljön för fjärrskrivbordstjänster
För att optimera prestanda är det bra att program identifierar om de körs i en fjärrskrivbordstjänster-klientsession. När ett program till exempel körs på en fjärrsession bör det eliminera onödiga grafiska effekter, enligt beskrivningen i Grafiska effekter. Om användaren kör programmet i en lokal miljö är det inte lika viktigt att programmet optimerar sitt beteende.
I följande exempel visas en funktion som returnerar TRUE- om programmet körs i en fjärrsession och FALSE- om programmet körs i konsolen.
#include <windows.h>
#pragma comment(lib, "user32.lib")
BOOL IsRemoteSession(void)
{
return GetSystemMetrics( SM_REMOTESESSION );
}
Mer information finns i Körningslänkning till Wtsapi32.dll.
Du bör inte använda GetSystemMetrics(SM_REMOTESESSION) för att avgöra om programmet körs i en fjärrsession i Windows 8 och senare eller Windows Server 2012 och senare om fjärrsessionen också kan använda RemoteFX vGPU-förbättringarna av Microsoft Remote Display Protocol (RDP). I det här fallet identifierar GetSystemMetrics(SM_REMOTESESSION) fjärrsessionen som en lokal session.
Ditt program kan kontrollera följande registernyckel för att avgöra om sessionen är en fjärrsession som använder RemoteFX vGPU. Om det finns en lokal session tillhandahåller den här registernyckeln ID:t för den lokala sessionen.
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\GlassSessionId
Om ID:t för den aktuella sessionen där programmet körs är detsamma som i registernyckeln körs programmet i en lokal session. Sessioner som identifieras som fjärrsessioner på det här sättet omfattar fjärrsessioner som använder RemoteFX vGPU. Följande exempelkod visar detta.
#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;
}