C++ Direct3D桌面复制:如何从更改屏幕分辨率中恢复?

C++ Direct3D桌面复制:如何从更改屏幕分辨率中恢复?,c++,desktop,duplication,direct3d11,C++,Desktop,Duplication,Direct3d11,我正在开发一个桌面应用程序,它使用IDXGIOutputDuplication接口每秒拍摄几次屏幕照片。每当调用其AcquireNextFrame方法时,我都会检查返回的HRESULT是否为DXGI\u ERROR\u ACCESS\u LOST,以查看是否有某个事件使复制接口无效。我还有一个IDXGIFactory1,我使用isCurrent()查看图形设置中是否有任何更改,例如安装了新的GPU(出于某种原因)、连接了新的显示器,或者桌面的分辨率发生了更改 当isCurrent()返回fals

我正在开发一个桌面应用程序,它使用IDXGIOutputDuplication接口每秒拍摄几次屏幕照片。每当调用其AcquireNextFrame方法时,我都会检查返回的HRESULT是否为DXGI\u ERROR\u ACCESS\u LOST,以查看是否有某个事件使复制接口无效。我还有一个IDXGIFactory1,我使用isCurrent()查看图形设置中是否有任何更改,例如安装了新的GPU(出于某种原因)、连接了新的显示器,或者桌面的分辨率发生了更改

当isCurrent()返回false时,我的方法是使用IDXGIFactory1重建所有IDXGI和ID3D11接口。这意味着所有适配器、所有输出和所有复制接口。根据cout日志,每个监视器的接口似乎都已正确重建

这种方法的问题是,根据我观察到的情况,其OutputDuplication接口返回DXGI\u错误\u访问\u丢失代码的监视器即使在构造新接口时也无法恢复。所以,如果监视器A产生错误,然后我从监视器B捕获,它会给我屏幕上限。但如果我继续从监视器A捕获,我什么也得不到,可能只是DXGI\u错误\u访问\u丢失的错误代码

我知道这听起来有点奇怪,有些地方可能不清楚,但到目前为止,这是我能解释的最好的方式。我也试着在网上搜索,但没有任何效果。有什么想法吗


(还有,如果有什么帮助的话,我正在使用JNI,这样应用程序的Java代码就可以访问C++的Direct3D接口。这是我正在做的一个项目,那里没有人知道解决方案。)

好的,所以我又花了一些时间,找到了解决方案

重建所有ID3D11接口后,桌面复制接口(IDXGIOutputDuplication)仍然无效。可能是因为它是在屏幕分辨率仍在更新时检索到的

我所要做的就是在下一次调用AcquireNextFrame()时再次调用IDXGIOutput1的DuplicateOutput()方法,返回DXGI\u错误\u访问\u丢失的代码

把这个放在这里,以防有人有同样的问题