我使用以下代码在 Windows 上获取屏幕截图。
hdcMem = CreateCompatibleDC (hdc) ;
int cx = GetDeviceCaps (hdc, HORZRES);
int cy = GetDeviceCaps (hdc, VERTRES);
HBITMAP hBitmap(NULL);
hBitmap = CreateCompatibleBitmap (hdc, cx, cy) ;
SelectObject (hdcMem, hBitmap) ;
BitBlt(hdcMem, 0, 0, cx, cy, hdc, 0, 0, SRCCOPY);
但是,鼠标光标不显示。
我怎样才能获得光标?或者有图书馆可以做到这一点吗?
提前致谢。
在 BitBlt 之后和从 hdcMem 中选择位图之前,您可以执行以下操作:
CURSORINFO cursor = { sizeof(cursor) };
::GetCursorInfo(&cursor);
if (cursor.flags == CURSOR_SHOWING) {
RECT rcWnd;
::GetWindowRect(hwnd, &rcWnd);
ICONINFOEXW info = { sizeof(info) };
::GetIconInfoExW(cursor.hCursor, &info);
const int x = cursor.ptScreenPos.x - rcWnd.left - rc.left - info.xHotspot;
const int y = cursor.ptScreenPos.y - rcWnd.top - rc.top - info.yHotspot;
BITMAP bmpCursor = {0};
::GetObject(info.hbmColor, sizeof(bmpCursor), &bmpCursor);
::DrawIconEx(hdcMem, x, y, cursor.hCursor, bmpCursor.bmWidth, bmpCursor.bmHeight,
0, NULL, DI_NORMAL);
}
上面的代码使用全局光标状态来确定光标是否显示,因为您可能正在另一个进程中截取一个或多个窗口的屏幕截图。然后它获取目标窗口坐标以从屏幕进行调整。它获取有关光标的特定信息,包括其热点。它计算图标的绘制位置。最后,它获取光标图标的实际大小,以便可以在不进行任何拉伸的情况下绘制它。
据我所知,这种方法的唯一限制是:
- 如果启用它们,则不会获得光标阴影。
- 如果它是动画光标,则仅显示第一帧。据我所知,没有办法确定当前帧。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)