多次复制 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)

Windows远程桌面(mstsc)不能复制粘贴的解决办法

windows 2008 R2远程桌面无法本地复制文件到远程解决

windows server服务器远程桌面不能复制粘贴的解决方法

远程桌面无法复制粘贴

[windows][操作系统]复制文件夹到桌面经常到跑左上角导致桌面图标位置错乱