【发布时间】:2016-01-25 10:52:51
【问题描述】:
尝试使用 BitBlt 捕获窗口的内容。在这种可能很重要的特殊情况下,我说的是不可见的窗口/窗口上的不可见区域 - 由于 z 顺序不可见,它们是可见的但被其他窗口覆盖。我得到的只是一个黑匣子。
HDC winDC = GetWindowDC(hwnd);
HDC hdc_offscreen = CreateCompatibleDC(winDC);
HBITMAP bmp = CreateCompatibleBitmap(winDC, areaWidth, areaHeight);
HGDIOBJ origHandle = SelectObject(hdc_offscreen, bmp);
BitBlt(hdc_offscreen, rect.left, rect.top,
rect.right - rect.left,
rect.bottom - rect.top,
winDC, copy_from.left, copy_from.top, SRCCOPY);
// at this point i expect pixels to be there, but nah!
ReleaseDC(hwnd, winDC);
SelectObject(hdc_offscreen, origHandle);
DeleteDC(hdc_offscreen);
ReleaseDC(hWnd_main, winDC);
hwnd 是我要捕获的窗口。同样的事情就像启用 Aero 主题的魅力一样。我正在使用 Windows 7 专业版。
知道我错过了什么吗?
【问题讨论】:
-
你今天早些时候不是已经问过这个了吗? stackoverflow.com/questions/34988788/…那个问题怎么了?
-
我删除了这个问题,因为我不知道如何快速修复不正确的源代码引用。
-
您在周末还针对您较早的问题发布了一个完全错误的内容。我担心如果您没有立即得到答案,您可能会养成反复问同一个问题的习惯。
-
你的
BitBlt申请真的很……奇怪。无论如何:此功能根本不用于图像捕获。顾名思义,它的主要目的是对位图进行图形操作。请注意文档中的说明 “并非所有设备都支持 BitBlt 功能” - 您可能拥有一个甚至无法进行BitBlt操作的设备,您可以通过GetDeviceCaps进行检查 -
我可以看出这是不可取的。不过,让我再问你一次。如果一扇窗户在另一个窗户下面,为什么它会画任何东西?