在Windows 7上的图像捕获中,窗口的顶部会被切断

时间:2011-02-11 19:23:59

标签: bitmap screen capture

我们的应用程序中有一些代码可以捕获窗口的图像并将其保存到PNG文件并将其复制到剪贴板(C ++ API代码)。

在Windows XP上完美运行。它也适用于Windows 7,不同之处在于它看起来好像图像的顶部几条像素线已被切断,就像捕获的区域不包括窗口的前几行一样。然而,我们的代码清晰地从图像的顶部复制,如下所示。

enter image description here

(在Windows XP上,您会看到右侧的完整X加上窗口的顶部边框)

这是Windows 7上的一些空气或其他显示效果,还是有办法补偿这个?或者我们的代码中的某些内容是否可能导致此问题?

当然,我们可以确定窗口区域并从客户端窗口捕获它,并捕获更高的几行,但是线条怎么样,这似乎是任意的。

这里肯定存在一些根本性的缺陷或问题吗?

我们的代码大致如下:

RECT wndRect;
GetWindowRect(hwnd, &wndRect);
int Width = wndRect.right - wndRect.left;
int Height = wndRect.bottom - wndRect.top;
BYTE *pBits = 0;
BITMAPINFO bmpinfo = {sizeof(BITMAPINFO)};
bmpinfo.bmiHeader.biWidth = Width;
bmpinfo.bmiHeader.biHeight = Height;
bmpinfo.bmiHeader.biPlanes = 1;
bmpinfo.bmiHeader.biBitCount = 24;
bmpinfo.bmiHeader.biCompression = BI_RGB;
HBITMAP hBmp = CreateDIBSection(NULL, &bmpinfo, DIB_RGB_COLORS, (void**)&pBits, NULL, 0);
HDC hWndDC = GetWindowDC(hwnd);
HDC hDC = CreateCompatibleDC(hWndDC);
HBITMAP hOldBmp = (HBITMAP)SelectObject(hDC, hBmp);
BitBlt(hDC, 0, 0, Width, Height, hWndDC, 0, 0, SRCCOPY);

1 个答案:

答案 0 :(得分:0)

我曾经读过RECT coords切断了底部像素,但从未听说过顶部像素......可能会在某个地方调用api来获取窗口装饰的大小或者不是。

GetDCEx也可能有所帮助。