Снимок экрана с помощью курсора мыши - PullRequest
3 голосов
/ 27 октября 2009

Я использовал следующий код, чтобы получить снимок экрана в 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 Ответ

3 голосов
/ 11 апреля 2014

После вашего 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);
}

Приведенный выше код определяет, отображается ли курсор, используя глобальное состояние курсора, поскольку вы, вероятно, делаете снимок окна (или окон) в другом процессе. Затем он получает координаты целевого окна для настройки с экрана. Он получает конкретную информацию о курсоре, включая его точку доступа. Он вычисляет положение рисования иконки. Наконец, он получает фактический размер значка курсора, так что он может нарисовать его без растяжения.

Единственные ограничения этого подхода, о которых я знаю:

  • Вы не получите тени курсора, если они у вас включены.
  • Если это анимированный курсор, это просто показывает первый кадр. Насколько я знаю, нет способа определить текущий кадр.
...