我希望下面的代码仅截取指定窗口的屏幕快照,因为这样BitBlt更快。尝试将屏幕截图粘贴到MS Paint中后,我只得到了黑色矩形。
-(矩形的尺寸似乎是正确的,与给定窗口的分辨率匹配。)
#include<iostream>
#include<Windows.h>
int main() {
HWND wnd = FindWindow(NULL, "name_of_window - Google Chrome");
if (!wnd) {
return 0;
}
RECT rect;
GetWindowRect(wnd, &rect);
int width = rect.right - rect.left;
int height = rect.bottom - rect.top;
// copy screen to bitmap
HDC hScreen = GetWindowDC(wnd);
HDC hDC = CreateCompatibleDC(hScreen);
HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, width, height);
HGDIOBJ old_obj = SelectObject(hDC, hBitmap);
BOOL bRet = BitBlt(hDC, 0, 0, width,height, hScreen, 0, 0, SRCCOPY);
// save bitmap to clipboard
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBitmap);
CloseClipboard();
// clean up
SelectObject(hDC, old_obj);
DeleteDC(hDC);
ReleaseDC(NULL, hScreen);
DeleteObject(hBitmap);
}
我认为问题在于您执行工作的顺序。
在将位图放置在剪贴板上之前,应从存储设备上下文中选择它。
一旦将位图放置在剪贴板上,您将不再拥有它,因此您不应尝试删除它。
最好的方法可能是将// clean up
部分移到// save bitmap to clipboard
部分之前,并消除DelectObject(hBitmap)
语句。因此,您的代码的结尾可能应该是:
BitBlt(hDC, 0, 0, width, height, hScreen, 0, 0, SRCCOPY);
// clean up
SelectObject(hDC, old_obj); // selects hBitmap out of hDC
DeleteDC(hDC);
ReleaseDC(NULL, hScreen);
// save bitmap to clipboard
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBitmap); // clipboard now owns the bitmap
CloseClipboard();
如果这些更改后您仍然有问题,我将检查SetClipboardData调用的返回值。如果失败,GetLastError可能会提供线索。