DirectX 11 GetDisplayModeList()在远程桌面连接中失败

时间:2019-06-14 23:16:35

标签: c++ windows directx directx-11 direct3d

下午好,

我有一个可以在主机PC上运行的准系统Direct3D应用,但在通过远程桌面运行时无法初始化DirectX。

我追溯到此调用失败,并以

失败
    result = adapterOutput->GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ENUM_MODES_INTERLACED, &numModes, NULL);
    if(FAILED(result))
    {
        return false;
    }

它失败并显示:

result = 0x887a0022 : A resource is not available at the time of the call, but may become available later.

完整的初始化代码来自Rastertek教程,可在此处找到: http://www.rastertek.com/dx11tut03.html

有人知道解决此问题的方法吗?

2 个答案:

答案 0 :(得分:0)

从技术上讲不是解决方案,但是问题在于刷新率初始化,使用try {}-catch {}块绕过了它,这使我可以通过远程桌面以默认刷新率运行。其他所有初始化都没有问题

答案 1 :(得分:0)

远程桌面涉及一些极端情况,请记住,有时它使用的是“ Microsoft Basic Renderer”(又称软件WARP驱动程序)。参见this blog post

您还可以通过首先检测到GetDisplayModeList来保护您在远程情况下的使用。例如,legacy DXUT sample framework是在其枚举代码中完成的:

// 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,以获取仅使用窗口的“本机分辨率”作为窗口和“假全屏”的方法。对于远程桌面也都很好。

另一个带有远程桌面的“角落情况”是鼠标的“原始输入”。请参见MouseDirectX Tool Kit的实现。