我正在开发一个桌面应用程序,使用IDXGIOutputDuplication接口每秒多次截取屏幕图片。每当我调用其AcquireNextFrame方法时,我会检查返回的HRESULT是否为DXGI_ERROR_ACCESS_LOST,以查看是否有某些事件使复制接口无效。我还有一个IDXGIFactory1,并使用isCurrent()检查图形设置中是否有任何更改,例如安装了新GPU(出于某种原因),连接了新监视器或更改了桌面分辨率。
当isCurrent()返回false时,我的做法是使用IDXGIFactory1重建所有的IDXGI和ID3D11接口。这意味着所有适配器、所有输出和所有复制接口都需要重建。根据cout日志,每个监视器的接口似乎都已经成功地重建了。
我的问题在于,基于我所观察到的情况,输出复制接口返回DXGI_ERROR_ACCESS_LOST代码的监视器不会恢复,即使新接口已经构建好。因此,如果Monitor A出现错误,并且稍后我从Monitor B捕获,它会给我屏幕截图。但是,如果我继续从Monitor A捕获,我将无法获得任何屏幕截图,只可能得到DXGI_ERROR_ACCESS_LOST错误代码。
我知道这听起来有点奇怪,可能在某些部分不太清楚,但到目前为止这是我能解释的最好方式。我也尝试在网上搜索,但没有找到任何有用的信息。你们有什么想法吗?
(另外,如果有帮助的话,我正在使用JNI,以便应用程序的Java代码可以访问C++的Direct3D接口。这是我在工作中做的一个项目,那里没有人知道解决方案。)
当isCurrent()返回false时,我的做法是使用IDXGIFactory1重建所有的IDXGI和ID3D11接口。这意味着所有适配器、所有输出和所有复制接口都需要重建。根据cout日志,每个监视器的接口似乎都已经成功地重建了。
我的问题在于,基于我所观察到的情况,输出复制接口返回DXGI_ERROR_ACCESS_LOST代码的监视器不会恢复,即使新接口已经构建好。因此,如果Monitor A出现错误,并且稍后我从Monitor B捕获,它会给我屏幕截图。但是,如果我继续从Monitor A捕获,我将无法获得任何屏幕截图,只可能得到DXGI_ERROR_ACCESS_LOST错误代码。
我知道这听起来有点奇怪,可能在某些部分不太清楚,但到目前为止这是我能解释的最好方式。我也尝试在网上搜索,但没有找到任何有用的信息。你们有什么想法吗?
(另外,如果有帮助的话,我正在使用JNI,以便应用程序的Java代码可以访问C++的Direct3D接口。这是我在工作中做的一个项目,那里没有人知道解决方案。)