我们的应用程序中有一些代码可以捕获窗口的图像并将其保存到PNG文件并将其复制到剪贴板(C ++ API代码)。
在Windows XP上完美运行。它也适用于Windows 7,不同之处在于它看起来好像图像的顶部几条像素线已被切断,就像捕获的区域不包括窗口的前几行一样。然而,我们的代码清晰地从图像的顶部复制,如下所示。
(在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);
答案 0 :(得分:0)
我曾经读过RECT coords切断了底部像素,但从未听说过顶部像素......可能会在某个地方调用api来获取窗口装饰的大小或者不是。
GetDCEx也可能有所帮助。