【问题标题】:Duplicating Windows desktop more than one time多次复制 Windows 桌面
【发布时间】: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.

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

【问题讨论】:

  • 当然,一旦您获得了桌面内容的纹理,您可以在任意数量的窗口中显示它吗?

标签: c++ winapi directx directx-11


【解决方案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%。

【讨论】:

    猜你喜欢
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 2014-03-09
    • 2011-01-12
    • 2012-11-09
    • 1970-01-01
    • 2020-02-26
    相关资源
    最近更新 更多