BitBlt 仅捕获部分屏幕

Posted

技术标签:

【中文标题】BitBlt 仅捕获部分屏幕【英文标题】:BitBlt captures only partial screen 【发布时间】:2016-02-13 15:41:02 【问题描述】:

我正在尝试在 Windows 10 下使用 GDI 捕获屏幕的正方形部分。这就是我尝试的方式:

//Get screen DC
desktop = GetDC(NULL);

//Create a compatible bitmap of 32 x 32 px.
HDC hCaptureDC = CreateCompatibleDC(desktop);
HBITMAP captureBmp = CreateCompatibleBitmap(hCaptureDC, 32, 32);
SelectObject(hCaptureDC, captureBmp);

//loop:
BitBlt(hCaptureDC, 0, 0, 32, 32, desktop, sourceX, sourceY, SRCCOPY);
BitBlt(desktop, 0, 0, 32, 32, hCaptureDC, 0, 0, SRCCOPY);

因此,我将(sourceX, sourceY) 处的一个 32x32 像素矩形捕获到位图中,并将其绘制到屏幕上(左上角)。

但是,这会导致大部分是黑色方块。只有 GDI 之前绘制的东西才会被捕获。我很确定第一个BitBlt 是问题所在。如果我指定WHITENESS 作为最后一个参数,我会得到一个白色方块,这正是我所期望的。所以从屏幕捕捉到位图似乎是有问题的。

如果我直接从一个屏幕复制到另一个屏幕使用

BitBlt(desktop, 0, 0, 32, 32, desktop, sourceX, sourceY, SRCCOPY);

,一切都按预期进行。

我也试过CAPTUREBLT这个标志。

如何将整个区域捕获到位图中?

【问题讨论】:

【参考方案1】:

这一行

HBITMAP captureBmp = CreateCompatibleBitmap(hCaptureDC, 32, 32);

应该是

HBITMAP captureBmp = CreateCompatibleBitmap(desktop, 32, 32);

原因在documentation page 上为CreateCompatibleBitmap 解释:

创建内存设备上下文时,它最初会选择一个 1×1 单色位图。如果在 CreateCompatibleBitmap 中使用此内存设备上下文,则创建的位图是单色位图。要创建彩色位图,请使用用于创建内存设备上下文的 HDC

【讨论】:

以上是关于BitBlt 仅捕获部分屏幕的主要内容,如果未能解决你的问题,请参考以下文章

BitBlt 无法正确捕获标题栏

opencv 桌面捕获在大字体模式下仅返回窗口上的部分屏幕

BitBlt 转换为字节数组并从 c++ 解析为 c#

BitBlt 屏幕截图在 Windows 10 上不起作用

如何让 tesseract-ocr 从屏幕上的坐标读取?

wia adf 仅捕获页面的一部分