【问题标题】:Capture screen shot with mouse cursor使用鼠标光标捕获屏幕截图
【发布时间】:2010-12-10 09:04:55
【问题描述】:

我已使用以下代码在 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);

但是,鼠标光标没有出现。

如何获得光标?或者有图书馆可以做到吗?

提前致谢。

【问题讨论】:

标签: windows jpeg multimedia bmp dib


【解决方案1】:

在您的 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);
}

上面的代码使用全局光标状态判断光标是否正在显示,因为您可能正在另一个进程中截取一个(或多个窗口)的屏幕截图。然后它获取目标窗口坐标以从屏幕进行调整。它获取有关光标的特定信息,包括其热点。它计算图标的绘制位置。最后,它会得到光标图标的实际大小,这样它就可以在没有任何拉伸的情况下绘制它。

我所知道的这种方法的唯一限制是:

  • 如果启用了光标阴影,则不会出现。
  • 如果是动画光标,则只显示第一帧。据我所知,目前无法确定当前帧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2014-03-25
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多