【问题标题】:WinAPI BitBlt freezes for minutesWinAPI BitBlt 冻结几分钟
【发布时间】:2017-04-05 21:05:23
【问题描述】:

我对@9​​87654321@ 函数做了一点修改。在某些计算机上,不幸的是我没有找到它们之间的关系,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。有趣的是,在冻结的计算机上,它随机冻结。所以通常在那里它工作得很快(几毫秒)然后冻结。

【问题讨论】:

  • 为什么会发生这种情况 -- BitBlt 这样的函数不是高度依赖于您使用的设备/硬件吗?在一台设备上有效的东西可能在另一台设备上无效(这就是为什么有一个 device context 参数)。另外,为什么不检查 Win API 调用的返回值?由于您在不同的计算机上运行它,实际上必须检查 Win API 调用的返回值。
  • @PaulMcKenzie 这是 Qt 代码。为什么不检查?我不确切知道,但据我所知,函数不会因异常而失败。与设备有趣的想法,但没有帮助。此类功能冻结 3 分钟是不行的。一定是原因。
  • 这很有帮助,我知道这一点的原因是我个人必须调试与特定设备(在我的情况下是打印机)相关的设备上下文相关功能失败的代码。如果不检查返回码,您只是假设这些功能“工作”。同样,由于您计划在各种计算机上运行它,因此必须检查返回码。你错过了a lot of info if the function fails
  • 别喊了。这是您发布的内容:--And on some computers,。我给你的建议是我个人遇到的与此类似的代码。你可以接受也可以离开。
  • 大写单词在互联网世界中被认为是大喊大叫。其次,我花时间试图给你建议,但既然你什么都不听,那就继续等待别人回应你。

标签: c++ windows qt winapi screenshot


【解决方案1】:

问题出在 Aero 上。使用 BitBlt 冻结的计算机有 Win7 和 Aero。没有 Aero 一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多