WinAPI / GDI:为什么大窗口的快照包含任务栏?

时间:2010-07-11 12:27:33

标签: winapi bitmap gdi bitblt

我正在使用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); 

这适用于小窗户,但一旦我尝试更大的窗户 而不是屏幕。

即。任务栏也被保存了。什么给了?

1 个答案:

答案 0 :(得分:3)

这是正常的,这样的屏幕截图可以准确显示您在显示器上看到的内容。包括任务栏。您需要将捕获的区域限制为要捕获的窗口的边界。使用GetWindowRect()并相应地调整位图的大小和传递给BitBlt()的参数。

PrintWindow只有在目标窗口实现WM_PRINT和WM_PRINTCLIENT消息时才能工作。易于实施但经常被忽视。