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

WinAPI/GDI:为什么大型窗口的快照包含任务栏?,winapi,bitmap,gdi,bitblt,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,

我正在使用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); 
这对小窗口非常有效,但一旦我尝试使用更大的窗口 而不是屏幕


i、 任务栏也被保存了。提供什么?

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


仅当目标窗口实现WM_PRINT和WM_PRINTCLIENT消息时,PrintWindow才能工作。易于实现,但经常被忽略。

我只是尝试了PrintWindow而不是BitBlt;它没有任务栏,但也没有窗口内容:(我还不确定,但我认为这与“像素所有权测试”有关(因为我在该窗口中使用OpenGL)谢谢,但我实际上是自己制作这个大窗口的,所以我并不是无意中脱离了它的矩形。从我在上面的链接中看到的,看起来我想要的可能根本不可能。也许我应该问另一个问题,如何捕捉包括模糊/屏幕外区域在内的窗口,答案是,mos不可能,不可能。这就是为什么有PrintWindow。但是如果窗口不支持它,或者包含不支持它的子窗口,那么您就完成了。