WinAPI BitBlt冻结几分钟

WinAPI BitBlt freezes for minutes

本文关键字:分钟 几分钟 BitBlt 冻结 WinAPI      更新时间:2023-10-16

我稍微修改了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;
}

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

问题出在 Aero 中。使用BitBlt冻结的计算机具有Win7和Aero。没有航空一切都好。