由于某种原因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:此系统不支持指定的设备接口或功能级别。
我将在这里发布@weggo 的答案,因为我差点错过了!
对于那些将来可能会偶然发现此问题的人,调用 SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) 可以使 DuplicateOutput1 成功。不过,我不知道为什么 DuplicateOutput1 检查进程 dpi 版本。
我只想补充一点,您必须在清单设置中的解决方案属性中将 DPI 感知设置为 False,才能使 SetProcessDpiAwarenessContext 正常工作:)