DXGI 1.5 DuplicateOutput1 失败并显示 DXGI_ERROR_UNSUPPORTED (0x887a0004)

Diz*_*zzy 3 dxgi

由于某种原因DuplicateOutput1失败的地方DuplicateOutput没有。

#include <D3D11.h>
#include <DXGI1_5.h>

int main() {
    ID3D11Device *device;
    D3D_FEATURE_LEVEL levels[] = { D3D_FEATURE_LEVEL_11_1 };
    D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, levels, ARRAYSIZE(levels), D3D11_SDK_VERSION, &device, NULL, NULL);

    IDXGIDevice *dxDevice;
    device->QueryInterface<IDXGIDevice>(&dxDevice);

    IDXGIAdapter *adapter;
    dxDevice->GetAdapter(&adapter);

    IDXGIOutput *output;
    adapter->EnumOutputs(0, &output);

    IDXGIOutput5 *output5;
    output->QueryInterface<IDXGIOutput5>(&output5);

    IDXGIOutputDuplication *outputDuplication;
    auto hr1 = output5->DuplicateOutput(device, &outputDuplication);
Run Code Online (Sandbox Code Playgroud)

这里是 S_OK

    const DXGI_FORMAT formats[] = { DXGI_FORMAT_B8G8R8A8_UNORM };
    auto hr2 = output5->DuplicateOutput1(device, 0, ARRAYSIZE(formats), formats, &outputDuplication);
}
Run Code Online (Sandbox Code Playgroud)

0x887a0004:此系统不支持指定的设备接口或功能级别。

Dan*_*iel 5

我将在这里发布@weggo 的答案,因为我差点错过了!

对于那些将来可能会偶然发现此问题的人,调用 SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) 可以使 DuplicateOutput1 成功。不过,我不知道为什么 DuplicateOutput1 检查进程 dpi 版本。

我只想补充一点,您必须在清单设置中的解决方案属性中将 DPI 感知设置为 False,才能使 SetProcessDpiAwarenessContext 正常工作:)