【问题标题】:BitBlt captures only partial screenBitBlt 仅捕获部分屏幕
【发布时间】: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这个标志。

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

【问题讨论】:

    标签: c++ windows gdi bitblt


    【解决方案1】:

    这一行

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

    应该是

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

    原因在documentation page 上为CreateCompatibleBitmap 解释:

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

    【讨论】:

      猜你喜欢
      • 2013-01-15
      • 1970-01-01
      • 2011-10-26
      • 2012-05-24
      • 2020-10-28
      • 2014-07-02
      • 2016-03-28
      • 2015-03-14
      • 2012-04-20
      相关资源
      最近更新 更多