繁体   English   中英

BitBlt仅捕获部分屏幕

[英]BitBlt captures only partial screen

我试图在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 px矩形捕获到位图中并将其绘制到屏幕上(左上角)。

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

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

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

一切都按预期工作。

我也尝试过CAPTUREBLT旗帜。

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

这条线

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

应该

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

原因在CreateCompatibleBitmap文档页面上解释:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM