我正在使用GDI +来获取窗口快照,代码是:
CComBSTR bstrfname (fname);
HDC hdc = CreateCompatibleDC (hDC);
HBITMAP hbmp = CreateCompatibleBitmap (hDC, CFG_WIDTH, CFG_HEIGHT);
HBITMAP hbmp0 = (HBITMAP)SelectObject (hdc, hbmp);
BitBlt (hdc, 0, 0, CFG_WIDTH, CFG_HEIGHT, hDC, 0, 0, SRCCOPY);
Gdiplus::Bitmap *bmp = new Gdiplus::Bitmap (hbmp, NULL);
CLSID encoderClsid; GetEncoderClsid (L"image/png", &encoderClsid);
bmp->Save (bstrfname, &encoderClsid, NULL);
delete bmp;
SelectObject (hdc, hbmp0);
DeleteObject (hbmp);
DeleteDC (hdc);
之前设置hDC:
hWnd=CreateWindowEx(...); hDC=GetDC(hWnd);
这适用于小窗户,但一旦我尝试更大的窗户 而不是屏幕。
即。任务栏也被保存了。什么给了?
答案 0 :(得分:3)
这是正常的,这样的屏幕截图可以准确显示您在显示器上看到的内容。包括任务栏。您需要将捕获的区域限制为要捕获的窗口的边界。使用GetWindowRect()并相应地调整位图的大小和传递给BitBlt()的参数。
PrintWindow只有在目标窗口实现WM_PRINT和WM_PRINTCLIENT消息时才能工作。易于实施但经常被忽视。