首页 > 解决方案 > BitBlt 绘制黑色方块 (Windows 7)

问题描述

我正在创建一个桌面虚拟化捕获驱动程序。基本上,驱动程序打开一个虚拟化桌面并将屏幕捕获到位图缓冲区中,并将其发送到客户端,然后将其绘制到他们的屏幕上 ( GetDIBits/ SetDIBits)。

问题是,问题出PrintWindow在 Windows 7 中。在 Windows 8.1+ 中,此功能添加了一个额外的标志,可以PW_RENDERFULLCONTENT一次性绘制整个桌面,但在 Windows 7 中,此标志不存在。

我的问题是,如何在 Windows 7 中正确模拟此标志行为,以便正确绘制所有窗口。例如,如果没有此标志,当主机在其虚拟桌面中打开 Chrome 时,PrintWindow调用会失败,因为 Chrome 是使用 Aura 渲染的,并且PrintWindow不是为处理此功能而构建的,因此 chrome 在中间绘制了一个黑色方块:

图片

标签: cwinapigdibitblt

解决方案


快速测试表明捕获屏幕的正确区域会产生正确的结果。像这样的代码:

memDC.BitBlt(0, 0, src_rect.Width(), src_rect.Height(), 
             &screen, 
             src_rect.TopLeft().x, src_rect.TopLeft().y, 
             SRCCOPY | CAPTUREBLT);

...足以捕捉您在 Chrome 中显示的问题的图片:

在此处输入图像描述

CAPTUREBLT建议使用,但对于这种特殊情况似乎并不是真正必要的。此代码使用 MFC 的 BitBlt 包装器,但与直接调用相比,这不会改变任何重要的内容BitBlt


推荐阅读