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 仅捕获部分屏幕的主要内容,如果未能解决你的问题,请参考以下文章