Captura de pantalla capturada con el cursor del mouse

votos
3

He utilizado el siguiente código para obtener una captura de pantalla en 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);

Sin embargo, el cursor del mouse no aparece.

¿Cómo podría obtener el cursor? o ¿Hay una biblioteca que pueda hacer eso?

Gracias por adelantado.

Publicado el 27/10/2009 a las 06:33
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
2

Después de que su BitBlt y antes de seleccionar el mapa de bits de nuevo fuera de hdcMem, usted puede hacer esto:

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);
}

El código anterior se da cuenta de si el cursor está mostrando, con el estado del cursor mundial, ya que es probable que tomar una captura de pantalla de una ventana (o ventanas) en otro proceso. A continuación, se pone la ventana de destino para ajustar las coordenadas de pantalla. Se pone información específica sobre el cursor, incluyendo su punto de acceso. Se calcula la posición de dibujo del icono. Por último, se obtiene el tamaño real del símbolo del cursor para que se pueda extraer sin ningún estiramiento.

Las únicas limitaciones a este enfoque, que yo sepa son:

  • No te dan sombras del cursor si se ha habilitado ellas.
  • Si se trata de un cursor animado, esto sólo muestra el primer fotograma. Por lo que yo sé, no hay manera de determinar el marco actual.
Respondida el 11/04/2014 a las 13:36
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more