使用PrintWindow渲染镶边

时间:2018-06-30 22:33:56

标签: c google-chrome winapi

我正在尝试使用PrintWindow在我的画布上涂铬。这是我用来渲染桌面捕获的代码

PRECT lpRect;
GetWindowRect(g_Window, lpRect);

HDC hDeviceContext    =
   CreateCompatibleDC(g_DeviceContextMain);
HBITMAP hBitmapWindow = 
   CreateCompatibleBitmap(g_DeviceContextMain, lpRect->right - lpRect->left, lpRect->bottom - lpRect->top);

SelectObject(hDeviceContext, hBitmapWindow);
if (PrintWindow(g_Window, hDeviceContext, g_IsAtleast81 ? 0x00000002 : NULL)) {
    BitBlt(g_DeviceContextClient, 
       lpRect->left, lpRect->top, lpRect->right - lpRect->left, lpRect->bottom - lpRect->top, hDeviceContext, NULL, NULL, SRCCOPY);
}

DeleteObject(hBitmapWindow);
DeleteDC(hDeviceContext);

这是我打开Chrome浏览器并捕获屏幕时的输出(Windows 7)

1

我可以在Windows 10中通过向PW_RENDERFULLCONTENT添加PrintWindow标志来解决此问题,但不幸的是,此标志仅在Windows 8.1及更高版本中可用。我需要使它在Windows 7/8中工作。

在捕获屏幕之前,我还尝试在Chrome中禁用硬件加速。结果还是一样!

有什么办法可以解决此问题,例如在绘制主窗口时没有黑色矩形?还是在Windows <8中复制PW_RENDERFULLCONTENT在Windows> = 8.1中的作用?

1 个答案:

答案 0 :(得分:0)

您可能无法使用PrintWindow打印镶边窗口,但可以使用BitBlt。该功能只会获取屏幕的一部分,因此与PrintScreen不同,您无法获取最小化窗口的位图。

BitBlt Docs

以及它如何在webrtc中实现: https://cs.chromium.org/chromium/src/third_party/webrtc/modules/desktop_capture/window_capturer_win.cc