我一直在尝试制作一个使用桌面复制 api 的应用程序,但是没有使用 directx 的经验,结果证明这是一个相当大的挑战。一切似乎都有效,直到我调用output1->DuplicateOutput()
它返回 E_NOINTERFACE。此错误未在 msdn 文档中定义,因此我无法诊断问题。我认为这段代码应该可以工作,但我必须遗漏一些东西。
#include <windows.h>
#include <d3d12.h>
#include <dxgi1_5.h>
int main()
{
HRESULT hr;
ID3D12Debug *debug;
hr = D3D12GetDebugInterface(IID_PPV_ARGS(&debug));
debug->EnableDebugLayer();
IDXGIFactory1 *factory;
hr = CreateDXGIFactory1(IID_PPV_ARGS(&factory));
IDXGIAdapter1 *adapter;
hr = factory->EnumAdapters1(0, &adapter);
factory->Release();
IDXGIOutput *junkput;
hr = adapter->EnumOutputs(0, &junkput);
IDXGIOutput1 *output1;
hr = junkput->QueryInterface(IID_PPV_ARGS(&output1));
junkput->Release();
ID3D12Device *device;
hr = D3D12CreateDevice(adapter, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&device));
IDXGIOutputDuplication *dupl;
hr = output1->DuplicateOutput(device, &dupl);
return 0;
}
在我的调试窗口中,我注意到当我调用output1->DuplicateOutput
.
更新:
我将问题缩小到我使用的是 ID3D12Device 而不是 ID3D11Device 的事实。正如此代码有效的事实所示:
ID3D11Device *device;
D3D_FEATURE_LEVEL reallevel;
ID3D11DeviceContext *context;
hr = D3D11CreateDevice(adapter, D3D_DRIVER_TYPE_UNKNOWN, nullptr, NULL, featurelevels, ARRAYSIZE(featurelevels), D3D11_SDK_VERSION, &device, &reallevel, &context);
IDXGIOutputDuplication *dupl;
hr = output1->DuplicateOutput(device, &dupl);
我不明白为什么这是一个问题。桌面复制api不兼容directx 12吗?