使用鼠标光标截取屏幕截图

3
我曾使用下面的代码在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);

然而,鼠标光标没有显示出来。
我该如何获取光标?或者有没有库可以做到这一点?
提前致谢。

1
这个能有帮助吗?https://dev59.com/7XNA5IYBdhLWcg3wjOhS - o.k.w
1个回答

4

在进行 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);
}

上面的代码使用全局光标状态来确定光标是否显示,因为您可能正在截取另一个进程中的窗口(或窗口)。然后它获取目标窗口坐标以进行屏幕调整。它获取有关光标的特定信息,包括其热点。它计算图标的绘制位置。最后,它获取光标图标的实际大小,以便在没有任何拉伸的情况下绘制它。
我知道这种方法的唯一限制是:
- 如果启用了光标阴影,则无法获取光标阴影。 - 如果是动画光标,则仅显示第一帧。据我所知,没有办法确定当前帧。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接