桌面复制API捕获特定窗口

时间:2018-09-18 15:52:10

标签: c# c++ desktop-duplication

我一直在试图找到一种使用桌面复制API捕获特定窗口的方法,而不是剪辑捕获的桌面的一部分。

剪辑的问题是,任何重叠的应用程序都将显示在我尝试捕获的应用程序之上。我知道有可能捕获一个特定的窗口,即使它最终在另一个窗口的后面,但是,我不确定Destkop Duplication API是否可以实现此功能,或者是否为此使用了其他功能。

对于上下文,我正在开发一个Unity应用程序以查看虚拟现实中的桌面。目前,我正在使用uDesktopDuplication将桌面呈现为材质,并提供一种将API与C#结合使用的方式。

任何有关如何克服此问题的建议将不胜感激。从发表之前的研究中,我很难找到有关该主题的许多相关信息。 :)

1 个答案:

答案 0 :(得分:-1)

由于桌面复制API共享整个监视器从硬件内存到调用者的后台缓冲区,因此无法使用桌面复制来捕获特定窗口。但是您可以尝试Windows Magnification APIs。我们有相同的要求,经过大量研究工作,我们认为Magnification API是该用例的合适选择,并继续使用该方法。

有可能仅捕获特定的窗口或一组窗口,而通过放大镜方法过滤掉不需要的窗口。但是,过滤器列表的最大限制为24,因此我们只需要枚举与所需窗口重叠的窗口,保留Z顺序,然后将重叠的窗口添加到过滤器列表中即可。 99%的时间中,重叠的窗口不会超过24个,即使重叠的窗口超过24个,您也可以通过根据以下情况应用一些巧妙的过滤逻辑轻松过滤掉不需要的窗口枚举要过滤的窗口期间的Z顺序,坐标等。

如果您的窗口位于所有其他窗口的顶部或完全可见,则无需担心过滤器列表,除非窗口的Z顺序有动态变化(例如:窗口落后其他应用)。仅当您希望即使窗口停留在其他窗口之后也能够捕获窗口时,才需要过滤器列表。

也可以使用GDI方法捕获特定的窗口,但是对于硬件加速的窗口(例如chrome,firefox等)则失败。

参考: https://www.codeproject.com/Articles/607288/Screenshot-using-the-Magnification-library