DesktopImageInSystemMemory DXGI_OUTDUPL_DESC

我需要这个variables为TRUE,以便我可以使用IDXGIOutputDuplication的MapDesktopSurface

我们如何设置这是真的。 以前的设置可以做什么。

这是一个链接

http://msdn.microsoft.com/en-us/library/windows/desktop/hh404622(v=vs.85).aspx

我面临同样的问题…所以这是你需要做的:

MapDesktopSurface方法将大部分时间返回DXGI_ERROR_UNSUPPORTED,因为图像不在系统内存中,而是在GPU内存中。

在这种情况下,您需要将该图像从GPU内存传输到系统内存

那么该怎么做?

  1. ID3D11Texture2D类型的D3D11_TEXTURE12D_DESC创建一个描述符。

  2. 在使用IDXGIOutputDuplication::AcquireNextFrame获取的图像( ID3D11Texture2D )上使用IDXGIOutputDuplication::AcquireNextFrame来填充描述符。

  3. 你得到的这个描述符有frameDescriptor.Usage设置为D3D11_USAGE_DEFAULT

  4. 您需要使用以下参数设置描述符(让别人保持原样):

     frameDescriptor.Usage = D3D11_USAGE_STAGING; frameDescriptor.CPUAccessFlags = D3D11_CPU_ACCESS_READ; frameDescriptor.BindFlags = 0; frameDescriptor.MiscFlags = 0; frameDescriptor.MipLevels = 1; frameDescriptor.ArraySize = 1; frameDescriptor.SampleDesc.Count = 1; 
  5. 现在,使用上面的描述符创建一个新的分段缓冲区ID3D11Texture2D ),如下所示:

     m_Device->CreateTexture2D(&frameDescriptor, NULL, &newId3d11Texture2D); 
  6. 将获取的图像的内容复制到分段缓冲区 ,如下所示:

     m_DeviceContext->CopyResource(newId3d11Texture2D, m_AcquiredDesktopImage); 
  7. 重要:使用IDXGIOutputDuplication::ReleaseFrame()释放获取的帧

  8. 现在你可以随心所欲地处理这个新纹理( newId3d11Texture2D )了!

映射它,如果你想…

这应该足以回答你的查询…如果你想要更多的信息,你可以随时检查msdn页面或通过评论问…