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

时间:2015-07-03 16:46:34

标签: c++ desktop duplication direct3d11

我正在开发一个桌面应用程序,它使用IDXGIOutputDuplication接口每秒拍摄几次屏幕图片。每当我调用它的AcquireNextFrame方法时,我都会检查返回的HRESULT是否为DXGI_ERROR_ACCESS_LOST,以查看某个事件是否使复制接口无效。我还有一个IDXGIFactory1,我使用isCurrent()来查看图形设置中是否有任何更改,例如安装了新的GPU(由于某种原因),附加了新的监视器,或者桌面的分辨率已更改。

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

我对这种方法的问题在于,基于我观察到的情况,即使构造了新接口,其OutputDuplication接口返回DXGI_ERROR_ACCESS_LOST代码的监视器也永远不会恢复。因此,如果监视器A产生错误,稍后我从监视器B捕获,它会给我屏幕上限。但如果我继续从监视器A捕获,我无法得到任何东西,可能只是DXGI_ERROR_ACCESS_LOST错误代码。

我知道这听起来有些奇怪,有些部分可能不清楚,但到目前为止,这是我能解释的最佳方式。我也试过在线搜索,但没有任何帮助。有什么想法吗?

(另外,如果有任何帮助,我正在使用JNI,以便应用程序的Java代码可以访问C ++的Direct3D接口。这是我正在做的一个项目,没有人知道解决方案。)

1 个答案:

答案 0 :(得分:3)

好的,所以我正在摆弄更多,我找到了解决方案。

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

当我下次调用AcquireNextFrame()返回DXGI_ERROR_ACCESS_LOST代码时,我所要做的就是再次调用IDXGIOutput1的DuplicateOutput()方法。

将此放在这里以防万一有任何人遇到同样的问题。