我需要在一组窗口中复制桌面。我这样做了:
ID3D11Device* Device;
D3D11CreateDevice(...&Device)
...
IDXGIOutputDuplication* DeskDupl;
IDXGIOutput1::DuplicateOutput(Device, DeskDupl);
对于一个复制桌面的窗口,它可以正常工作,但对于另一个窗口,我在DuplicateOutput()
上获得了E_INVALIDARG。 MSDN表示这意味着:The calling application is already duplicating this desktop output.
是否可以将桌面复制到几个窗口,而不仅仅是一个窗口?
答案 0 :(得分:1)
似乎不是您的方法,请参阅IDXGIOutput1::DuplicateOutput方法
的remmars部分默认情况下,只有四个进程可以使用IDXGIOutputDuplication 在单个会话中同时进行接口。 一个过程可以 在一个桌面上只有一个桌面复制界面 输出; 但是,该进程可以有桌面重复 作为桌面一部分的每个输出的接口。
但是你可以用其他方式做到这一点,如果你只想在不同的窗口中渲染相同的场景,我建议使用多个交换链。
答案 1 :(得分:1)
我已将此实现为在坐标(-32000,-32000)处创建隐藏窗口,该窗口将作为DirectX IDXGIOutput1::DuplicateOutput()
中的主要屏幕输出。
创建后,使用DWM将此隐藏窗口镜像到所需的窗口,如my other answer所示:
hr = DwmRegisterThumbnail();
hr = DwmUpdateThumbnailProperties();
即使对于几个大的(1920x1200)窗口,最终的性能也足够了。 CPU负载不高于5%。