我有一点修改后的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。有趣的是,在计算机上,冻结,它随机冻结。所以通常在那里工作得很快(几毫秒),然后冻结。
答案 0 :(得分:0)
Aero存在问题。使用BitBlt冻结的计算机具有Win7和Aero。没有Aero一切都好。