我正在使用PrintWindow进行IE的屏幕截图。问题是有时候我会得到黑色区域的图像。它可能是整个html内容,什么是黑色,有时只有某些区域是黑色。
在拍摄之间不会改变IE的内容。
奇怪的是,在某些计算机上,我得到的是非常黑的图像,有些我永远不会得到它们。
我用Fx测试过,并且有相同的黑色图像。
HBITMAP ShootWindow(HWND hWnd)
{
RECT rect = {0};
GetWindowRect(hWnd, & rect);
HDC hDC = GetDC(hWnd);
if(hDC == NULL)
throw "GetDC failed.";
HDC hTargetDC = CreateCompatibleDC(hDC);
if(hTargetDC == NULL)
throw "CreateCompatibleDC failed.";
HBITMAP hBitmap = CreateCompatibleBitmap(hDC, rect.right - rect.left, rect.bottom - rect.top);
if(hBitmap == NULL)
throw "CreateCompatibleBitmap failed.";
if(!SelectObject(hTargetDC, hBitmap))
throw "SelectObject failed.";
if(!PrintWindow(hWnd, hTargetDC, 0))
throw "PrintWindow failed.";
ReleaseDC(hWnd, hDC);
ReleaseDC(hWnd, hTargetDC);
return hBitmap;
}
我找到了一些链接,但他们没有回答:
http://www.vbforums.com/showthread.php?t=555250 http://www.codeguru.com/forum/archive/index.php/t-357211.html http://social.msdn.microsoft.com/forums/en-US/winforms/thread/3e3decd8-ced1-4f17-a745-466e5aa91391/
答案 0 :(得分:2)
在拍摄使用GPU的应用程序的屏幕截图时,这似乎很常见。 BitBlt可以成功复制PrintWindow失败的像素。
WINDOWINFO wi;
GetWindowInfo(hWnd, &wi);
BitBlt(hdc, 0, 0, rect.right - rect.left, rect.bottom - rect.top, hDC, wi.rcClient.left, wi.rcClient.top, SRCCOPY);
答案 1 :(得分:0)
问题在于,在给定PrintWindow function或WM_PRINT message时,并非所有程序都提供重绘窗口所需的功能。
答案 2 :(得分:0)
使用SetWindowLong设置WS_EX_COMPOSITED,然后执行PrintWindow()将其设置回以前的状态(或将其保留为COMPOSITED来加快速度...但这会影响实际窗口的可见性,除非禁用了硬件acc)查看WS_EX_LAYERED并将不透明度设置为254是否会更好
(忘了说...这是可行的,但仅适用于顶层窗口,即使您在顶层窗口上设置了复合窗口,尝试PrintWindow某些子项也无法工作)