D3D11CreateDeviceAndSwapChain不会在第二台显示器上切换到全屏

Man*_*ius 8 c++ directx direct3d dxgi

我遇到的原始问题是,我无法让我的游戏在我的第二台显示器上全屏运行.要显示设置并将主显示从第二个交换到第一个,让我的游戏全屏运行,没有任何问题.我的两台显示器的分辨率是相同的,因此问题必须在其他地方. 显示器

负责全屏交换的代码如下所示:

// create device and front/back buffers
if( FAILED( hr = D3D11CreateDeviceAndSwapChain( 
    nullptr,
    D3D_DRIVER_TYPE_HARDWARE,
    nullptr,
    createFlags,
    nullptr,
    0,
    D3D11_SDK_VERSION,
    &sd,
    &pSwapChain,
    &pDevice,
    nullptr,
    &pImmediateContext ) ) )
{
    throw CHILI_GFX_EXCEPTION( hr,L"Creating device and swap chain" );
}
Run Code Online (Sandbox Code Playgroud)

而交换链描述sd以前是这样创建的:

// create device and swap chain/get render target view
DXGI_SWAP_CHAIN_DESC sd = {};
sd.BufferCount = 1;
sd.BufferDesc.Width = Graphics::ScreenWidth;
sd.BufferDesc.Height = Graphics::ScreenHeight;
sd.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 1;
sd.BufferDesc.RefreshRate.Denominator = 60;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = key.hWnd;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.Windowed = !f;
sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
Run Code Online (Sandbox Code Playgroud)

f设置为true,代码完全按照我希望它在监视器1上执行的操作,但是窗口仍然显示在监视器2上.hr这也S_OK表明一切都很顺利.

DXGI参考说:

我们建议您创建一个窗口化的交换链,并允许最终用户通过IDXGISwapChain :: SetFullscreenState将交换链更改为全屏;

使用交换链方法快速修改代码以设置全屏状态会导致:

hr = pSwapChain->SetFullscreenState(TRUE, vOutput[0]);
Run Code Online (Sandbox Code Playgroud)

HRESULT hr表示该方法失败了E_FAIL.

作为额外的测试,更改vOutput[0]vOutput[1]使我的游戏在另一台显示器上全屏运行而没有任何问题.

试图找到有关这方面的信息导致我发送了多个Steam论坛帖子,其中不同的用户在尝试在Devil May Cry 4,Company of Heroes 2Resident Evil 5等游戏中全屏时遇到相同类型的错误.所有这些帖子都有一个共同点就是游戏没有在第二台显示器上全屏运行.根据这些帖子中的信息,我还发现如果屏幕分辨率设置为1680x1050或更低,全屏将起作用.

这让我相信实际的bug可能在direct3D文件中的某个地方,但在哪里呢?

为什么SetFullscreenState回国E_FAIL,并D3D11CreateDeviceAndSwapChain没有什么,我怎样才能使它工作?

如果不可能,那么SetFullscreenState实现相同目标的替代品是什么?