リモート デスクトップ サービス環境の検出

パフォーマンスを最適化するには、アプリケーションがリモート デスクトップ サービス クライアント セッションで実行されているかどうかを検出することをお勧めします。 たとえば、アプリケーションがリモート セッションで実行されている場合、「 グラフィック効果」で説明されているように、不要なグラフィック効果を排除する必要があります。 ユーザーがローカル環境でアプリケーションを実行している場合、アプリケーションがその動作を最適化することは重要ではありません。

次の例は、アプリケーションがリモート セッションで実行されている場合は TRUE 、コンソールでアプリケーションが実行されている場合は FALSE を 返す関数を示しています。

#include <windows.h>
#pragma comment(lib, "user32.lib")

BOOL IsRemoteSession(void)
{
   return GetSystemMetrics( SM_REMOTESESSION );
}

詳細については、「 Wtsapi32.dllへの実行時リンク 」を参照してください。

GetSystemMetrics(SM_REMOTESESSION) を使用して、アプリケーションが Windows 8 以降のリモート セッションで実行されているか、リモート セッションで Microsoft リモート ディスプレイ プロトコル (RDP) に対する RemoteFX vGPU の機能強化も使用している可能性がある場合は、Windows Server 2012以降を確認しないでください。 この場合、 GetSystemMetrics(SM_REMOTESESSION) はリモート セッションをローカル セッションとして識別します。

アプリケーションは、次のレジストリ キーをチェックして、セッションが RemoteFX vGPU を使用するリモート セッションであるかどうかを判断できます。 ローカル セッションが存在する場合、このレジストリ キーはローカル セッションの ID を提供します。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\GlassSessionId

アプリケーションが実行されている現在のセッションの ID がレジストリ キーと同じ場合、アプリケーションはローカル セッションで実行されます。 この方法でリモート セッションとして識別されるセッションには、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;
}