WinAPI BitBlt 冻结几分钟

WinAPI BitBlt freezes for minutes

我对 QScreen::grabWindow 函数做了一点修改。在某些计算机上,不幸的是我没有发现它们之间的关系,BitBlt 甚至会冻结几分钟!为什么会发生这种情况,我该怎么办?

QPixmap DetectionFlow::grabScreen(HWND h)
{
    RECT rect;
    GetClientRect(h, (LPRECT)&rect);

    // get the height and width of the screen
    int height = rect.bottom - rect.top;
    int width = rect.right - rect.left;

    // Create and setup bitmap
    HDC display_dc = GetDC(0);

    HDC bitmap_dc = CreateCompatibleDC(display_dc);

    HBITMAP bitmap = CreateCompatibleBitmap(display_dc, width, height);

    HGDIOBJ null_bitmap = SelectObject(bitmap_dc, bitmap);

    HDC window_dc = GetDC(h);
    BitBlt(bitmap_dc, 0, 0, width, height, window_dc, 0, 0, SRCCOPY);

    // clean up all but bitmap
    ReleaseDC(h, window_dc);

    SelectObject(bitmap_dc, null_bitmap);

    DeleteDC(bitmap_dc);


    const QPixmap pixmap = qt_pixmapFromWinHBITMAP(bitmap);

    DeleteObject(bitmap);

    ReleaseDC(0, display_dc);

    return pixmap;
}

PS。有趣的是,在计算机上,冻结的地方是随机冻结的。所以通常在那里它工作得很快(几毫秒)然后冻结。

问题出在 Aero 中。与 BitBlt 冻结的计算机有 Win7 和 Aero。没有Aero就OK了