使用PrintWindow制作屏幕截图时的黑色图片

时间:2009-08-14 19:56:01

标签: winapi screenshot

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

3 个答案:

答案 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 functionWM_PRINT message时,并非所有程序都提供重绘窗口所需的功能。

答案 2 :(得分:0)

使用SetWindowLong设置WS_EX_COMPOSITED,然后执行PrintWindow()将其设置回以前的状态(或将其保留为COMPOSITED来加快速度...但这会影响实际窗口的可见性,除非禁用了硬件acc)查看WS_EX_LAYERED并将不透明度设置为254是否会更好

(忘了说...这是可行的,但仅适用于顶层窗口,即使您在顶层窗口上设置了复合窗口,尝试PrintWindow某些子项也无法工作)