Bagikan melalui


Mendeteksi lingkungan Layanan Desktop Jarak Jauh

Untuk mengoptimalkan performa, adalah praktik yang baik bagi aplikasi untuk mendeteksi apakah aplikasi berjalan dalam sesi klien Layanan Desktop Jarak Jauh. Misalnya, ketika aplikasi berjalan pada sesi jarak jauh, aplikasi harus menghilangkan efek grafis yang tidak perlu, seperti yang dijelaskan dalam Efek Grafis. Jika pengguna menjalankan aplikasi di lingkungan lokal, aplikasi tidak kritis untuk mengoptimalkan perilakunya.

Contoh berikut menunjukkan fungsi yang mengembalikan TRUE jika aplikasi berjalan dalam sesi jarak jauh dan FALSE jika aplikasi berjalan di konsol.

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

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

Untuk informasi selengkapnya, lihat Penautan Run-time ke Wtsapi32.dll.

Anda tidak boleh menggunakan GetSystemMetrics(SM_REMOTESESSION) untuk menentukan apakah aplikasi Anda berjalan dalam sesi jarak jauh di Windows 8 dan yang lebih baru atau Windows Server 2012 dan yang lebih baru jika sesi jarak jauh mungkin juga menggunakan peningkatan RemoteFX vGPU ke Microsoft Remote Display Protocol (RDP). Dalam hal ini, GetSystemMetrics(SM_REMOTESESSION) akan mengidentifikasi sesi jarak jauh sebagai sesi lokal.

Aplikasi Anda dapat memeriksa kunci registri berikut untuk menentukan apakah sesi tersebut adalah sesi jarak jauh yang menggunakan RemoteFX vGPU. Jika ada sesi lokal, kunci registri ini menyediakan ID sesi lokal.

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

Jika ID sesi saat ini di mana aplikasi berjalan sama seperti di kunci registri, aplikasi berjalan dalam sesi lokal. Sesi yang diidentifikasi sebagai sesi jarak jauh dengan cara ini mencakup sesi jarak jauh yang menggunakan RemoteFX vGPU. Kode sampel berikut menunjukkan hal ini.

#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;
}