Удаленный рабочий стол связан с некоторыми примерами, и имейте в виду, что иногда он использует «Microsoft Basic Renderer» (например, программный драйвер WARP). См. это сообщение в блоге .
Вы также можете защитить использование GetDisplayModeList
в удаленном сценарии, обнаружив его в первую очередь. Например, устаревшая модель DXUT сделала это в коде перечисления:
// mode for the current screen resolution for the remote session.
if( 0 != GetSystemMetrics( SM_REMOTESESSION) )
{
DEVMODE DevMode;
DevMode.dmSize = sizeof( DEVMODE );
if( EnumDisplaySettings( nullptr, ENUM_CURRENT_SETTINGS, &DevMode ) )
{
NumModes = 1;
pDesc[0].Width = DevMode.dmPelsWidth;
pDesc[0].Height = DevMode.dmPelsHeight;
pDesc[0].Format = DXGI_FORMAT_R8G8B8A8_UNORM;
pDesc[0].RefreshRate.Numerator = 0;
pDesc[0].RefreshRate.Denominator = 0;
pDesc[0].ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE;
pDesc[0].Scaling = DXGI_MODE_SCALING_CENTERED;
}
}
Вы также не можете использовать «полноэкранный эксклюзивный» режим на удаленном рабочем столе:
if( GetSystemMetrics(SM_REMOTESESSION) != 0 )
{
sd.Windowed = TRUE;
}
Вам не нужно вообще использовать GetDisplayModeList
. Просто выберите разумный начальный размер или откройте окно «развернуто». См. directx-vs-templates для подхода, который просто использует «родное разрешение» рабочего стола как для оконного, так и для «поддельного полного экрана». Это также хорошо работает для удаленного рабочего стола.
Еще одним «угловым корпусом» с удаленным рабочим столом является «необработанный ввод» для мыши. См. Реализацию Mouse из DirectX Tool Kit .