多次复制 Windows 桌面
Posted
技术标签:
【中文标题】多次复制 Windows 桌面【英文标题】:Duplicating Windows desktop more than one time 【发布时间】:2014-04-24 03:09:42 【问题描述】:我需要在一组窗口中复制桌面。我是这样做的:
ID3D11Device* Device;
D3D11CreateDevice(...&Device)
...
IDXGIOutputDuplication* DeskDupl;
IDXGIOutput1::DuplicateOutput(Device, DeskDupl);
对于复制桌面的一个窗口,它可以正常工作,但对于另一个窗口,我在DuplicateOutput()
上得到 E_INVALIDARG。 MSDN 说的意思是:The calling application is already duplicating this desktop output.
是否可以将桌面复制到几个窗口,而不仅仅是一个?
【问题讨论】:
当然,一旦您获得了桌面内容的纹理,您可以在任意数量的窗口中显示它吗? 【参考方案1】:似乎不适合您的方法,请参阅 IDXGIOutput1::DuplicateOutput 方法的 remmers 部分
默认情况下,只有四个进程可以使用 IDXGIOutputDuplication 在单个会话中同时进行接口。 一个进程可以 一个桌面上只有一个桌面复制界面 输出; 但是,该进程可以有桌面副本 作为桌面一部分的每个输出的接口。
但是你可以用其他方式来做,如果你只是想在不同的窗口中渲染相同的场景,我建议使用多个交换链。
【讨论】:
“使用多个交换链”是什么意思?为每个 hWnd 调用 CreateSwapChainForHwnd,例如 CreateSwapChainForHwnd(device, hWnd[], ..., &swapChain[i]) ? @AntonK 我找到了一个使用 DirectX 9 here 的示例(代码在 10 楼),您可以尝试将其更新到 DirectX 11。 谢谢。这有助于更好地理解 DirectX【参考方案2】:我已将此实现为在坐标 (-32000, -32000) 处创建一个隐藏窗口,该窗口作为DirectX IDXGIOutput1::DuplicateOutput()
中的主屏幕输出。
创建后,这个隐藏窗口使用DWM镜像到需要的窗口,如my other answer所示:
hr = DwmRegisterThumbnail();
hr = DwmUpdateThumbnailProperties();
即使对于几个大 (1920x1200) 窗口,所产生的性能也足够了。 CPU负载不高于5%。
【讨论】:
以上是关于多次复制 Windows 桌面的主要内容,如果未能解决你的问题,请参考以下文章
windows 2008 R2远程桌面无法本地复制文件到远程解决