偵測遠端桌面服務環境
若要將效能優化,應用程式最好偵測它們是否正在遠端桌面服務用戶端會話中執行。 例如,當應用程式在遠端會話上執行時,應該消除不必要的圖形效果,如 圖形效果中所述。 如果使用者正在本機環境中執行應用程式,則應用程式對優化其行為並不重要。
下列範例顯示如果應用程式在遠端會話中執行,則傳回 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和更新版本,遠端會話是否也可能使用 Microsoft 遠端顯示通訊協定 (RDP) 的 RemoteFX vGPU 改進功能。 在此情況下, GetSystemMetrics (SM_REMOTESESSION) 會將遠端會話識別為本機會話。
您的應用程式可以檢查下列登錄機碼,以判斷會話是否為使用 RemoteFX vGPU 的遠端會話。 如果本機會話存在,此登錄機碼會提供本機會話的識別碼。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\GlassSessionId
如果應用程式執行所在的目前會話識別碼與登錄機碼中的識別碼相同,應用程式就會在本機會話中執行。 以這種方式識別為遠端會話的會話包括使用 RemoteFX vGPU 的遠端會話。 下列範例程式碼示範這項功能。
#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;
}