DirectX11桌面复制无法与NVIDIA

时间:2016-10-24 14:38:54

标签: c++ directx-11

我正在尝试使用DirectX desktop duplication API

我尝试从

运行exmaples

http://www.codeproject.com/Tips/1116253/Desktop-Screen-Capture-on-Windows-via-Windows-Desk

来自

https://code.msdn.microsoft.com/windowsdesktop/Desktop-Duplication-Sample-da4c696a

这两个都是使用DXGI进行截屏的示例。

我在机器上有NVIDIA GeForce GTX 1060 Windows 10 Pro。它有Intel™ Core i7-6700HQ处理器。

NVIDIA Control Panel > 3D Settings选择Auto select processor时,这些示例完全正常。

但是,如果我手动将设置设置为NVIDIA Graphics Card,样本将停止工作。

错误发生在以下行。

//IDXGIOutput1* DxgiOutput1
hr = DxgiOutput1->DuplicateOutput(m_Device, &m_DeskDupl);

hr(HRESULT)中的错误为DXGI_ERROR_UNSUPPORTED 0x887A0004

我是DirectX的新手,我不知道这个问题, NVIDIA不支持DirectX桌面复制吗?

如果是这种情况,那么有没有办法在程序开始时选择一个特定的处理器,以便程序可以在任何设置下运行?

#Edit

环顾四周之后,我向开发人员(Evgeny Pereguda)询问了codeproject.com

上的第二个样本项目

以下是讨论的链接 https://www.codeproject.com/Tips/1116253/Desktop-Screen-Capture-on-Windows-via-Windows-Desk?msg=5319978#xx5319978xx

在原始链接关闭的情况下,在codeproject.com上发布讨论的屏幕截图

discussion with Evgeny Pereguda

我还发现answer on stackoverflow明确表示无法使用桌面复制API来引用微软支持网站上的支持服务单https://support.microsoft.com/en-us/help/3019314/error-generated-when-desktop-duplication-api-capable-application-is-ru

从票证中引用

  

出现此问题是因为DDA不支持对其进行运行   Microsoft Hybrid系统上的独立GPU。按设计,通话   与这样的错误代码DXGI_ERROR_UNSUPPORTED一起失败   场景。

但是有一些应用程序可以在我的机器上以两种模式(集成显卡和独立模式)有效地复制Windows上的桌面。 (https://www.youtube.com/watch?v=bjE6qXd6Itw

我查看了我的计算机上Virtual Desktop的安装文件夹,可以看到关注的DLLs

SharpDX.D3DCompiler.dll
SharpDX.Direct2D1.dll
SharpDX.Direct3D10.dll
SharpDX.Direct3D11.dll
SharpDX.Direct3D9.dll
SharpDX.dll
SharpDX.DXGI.dll
SharpDX.Mathematics.dll

这可能表明此应用程序正在使用DXGI复制桌面,或者可能是应用程序能够在启动之前选择特定处理器。

无论如何问题仍然存在,是否还有其他有效的方法在两种模式下复制桌面?

2 个答案:

答案 0 :(得分:2)

可能的原因是桌面复制API存在某些内部限制,如Error generated when Desktop Duplication API-capable application is run against discrete GPU中所述:

  

...当应用程序尝试在Microsoft Hybrid系统上对独立GPU复制桌面映像时,应用程序可能无法正常运行,或者可能会生成以下错误之一:

     
      
  • 无法使用0x80070005
  • 创建Windows swapchain   
  • CDesktopCaptureDWM:IDXGIOutput1 :: DuplicateOutput failed:0x887a0004
  •   

除了使用不同的GPU之外,本文没有提出任何其他解决方法(没有更具体的细节,因为它是否完全以编程方式实现):

  

要解决此问题,请在集成GPU上运行应用程序,而不是在Microsoft Hybrid系统上的独立GPU上运行。

答案 1 :(得分:1)

Microsoft 引入了一个注册表值,可以通过编程方式设置该值来控制应用程序在哪个 GPU 上运行。完整答案here