C++ 通过现有IDXG设备获取新连接的显示器

C++ 通过现有IDXG设备获取新连接的显示器,c++,directx,directx-11,dxgi,C++,Directx,Directx 11,Dxgi,我有一个程序,可以在启动时创建ID3D11Device设备,在关闭时销毁。在创建ID3D11Device后连接第二个监视器时遇到问题。 在这段简化的代码中,它枚举适配器输出,而此枚举只返回一个监视器,即程序启动前连接的第一个监视器 A IDXGIDevice* DXGIDevice; D3D11Device->QueryInterface(IID_IDXGIDevice, (void**)&DXGIDevice); IDXGIAdapter* DXGIAdapter; DXGID

我有一个程序,可以在启动时创建
ID3D11Device
设备,在关闭时销毁。在创建
ID3D11Device
后连接第二个监视器时遇到问题。 在这段简化的代码中,它枚举适配器输出,而此枚举只返回一个监视器,即程序启动前连接的第一个监视器

A

IDXGIDevice* DXGIDevice;
D3D11Device->QueryInterface(IID_IDXGIDevice, (void**)&DXGIDevice);

IDXGIAdapter* DXGIAdapter;
DXGIDevice->GetAdapter(&DXGIAdapter);

IDXGIOutput* Output;
int i = 0;
while (DXGIAdapter->EnumOutputs(i, &Output) != DXGI_ERROR_NOT_FOUND)
{
    DXGI_OUTPUT_DESC desc;
    Output->GetDesc(&desc);

    PrintMonitor(desc.Monitor);
}
但如果我尝试手动创建工厂并获取主适配器,它将枚举两个监视器

B

IDXGIFactory* DXGIFactory;
IDXGIAdapter* DXGIAdapter;

CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)&DXGIFactory);
factory->EnumAdapters(0, &DXGIAdapter);

IDXGIOutput* Output;
int i = 0;
while (DXGIAdapter->EnumOutputs(i, &Output) != DXGI_ERROR_NOT_FOUND)
{
    DXGI_OUTPUT_DESC desc;
    Output->GetDesc(&desc);

    PrintMonitor(desc.Monitor);
}

我的问题是:这是否可能“刷新”从
DXGIDevice
设备获取的适配器的输出列表,并且是否可以看到任何与第一个(A)类似的监视器插件/插件代码?

方法
IDXGIFactory1::IsCurrent()
应该会有所帮助。如果返回FALSE,则应销毁并重新创建工厂以刷新信息。只需在每次出现后检查它即可
显示


我在directx vs templates项目中使用此方法支持HDR10输出。请参阅和。

如果您使用的是Windows 10 1809,则可以使用IDXGIFactory7::RegisterAdaptersChangedEvent,否则只需轮询(每次重新创建工厂)。如果您有一个窗口,则此官方示例演示了这一点: