【发布时间】:2017-04-05 21:05:23
【问题描述】:
我对@987654321@ 函数做了一点修改。在某些计算机上,不幸的是我没有找到它们之间的关系,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