WinAPI BitBlt会冻结几分钟

时间:2017-04-05 21:05:24

标签: c++ windows qt winapi screenshot

我有一点修改后的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。有趣的是,在计算机上,冻结,它随机冻结。所以通常在那里工作得很快(几毫秒),然后冻结。

1 个答案:

答案 0 :(得分:0)

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