偵測遠端桌面服務環境
若要將效能優化,最好讓應用程式偵測它們是否在遠端桌面服務用戶端會話中執行。 例如,當應用程式在遠程會話上執行時,應該消除不必要的圖形效果,如 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 改進的 Microsoft 遠端顯示通訊協定(RDP)時。 在此情況下,GetSystemMetrics(SM_REMOTESESSION) 會將遠端會話識別為本機會話。
您的應用程式可以檢查下列登錄機碼,以判斷會話是否為使用 RemoteFX vGPU 的遠端會話。 如果本機會話存在,此登錄機碼會提供本機會話的 ID。
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;
}