多次复制Windows桌面

时间:2014-04-24 03:09:42

标签: c++ winapi directx directx-11

我需要在一组窗口中复制桌面。我这样做了:

ID3D11Device* Device;
D3D11CreateDevice(...&Device)
...
IDXGIOutputDuplication* DeskDupl;
IDXGIOutput1::DuplicateOutput(Device, DeskDupl);

对于一个复制桌面的窗口,它可以正常工作,但对于另一个窗口,我在DuplicateOutput()上获得了E_INVALIDARG。 MSDN表示这意味着:The calling application is already duplicating this desktop output.

是否可以将桌面复制到几个窗口,而不仅仅是一个窗口?

2 个答案:

答案 0 :(得分:1)

似乎不是您的方法,请参阅IDXGIOutput1::DuplicateOutput方法

的remmars部分
  

默认情况下,只有四个进程可以使用IDXGIOutputDuplication   在单个会话中同时进行接口。 一个过程可以   在一个桌面上只有一个桌面复制界面   输出; 但是,该进程可以有桌面重复   作为桌面一部分的每个输出的接口。

但是你可以用其他方式做到这一点,如果你只想在不同的窗口中渲染相同的场景,我建议使用多个交换链。

答案 1 :(得分:1)

我已将此实现为在坐标(-32000,-32000)处创建隐藏窗口,该窗口将作为DirectX IDXGIOutput1::DuplicateOutput()中的主要屏幕输出。

创建后,使用DWM将此隐藏窗口镜像到所需的窗口,如my other answer所示:

hr = DwmRegisterThumbnail();
hr = DwmUpdateThumbnailProperties();

即使对于几个大的(1920x1200)窗口,最终的性能也足够了。 CPU负载不高于5%。