2009-10-27 5 views
3

J'ai utilisé le code suivant pour obtenir une capture d'écran sous Windows.Capture d'écran avec le curseur de la souris

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

Cependant, le curseur de la souris n'apparaît pas.

Comment puis-je obtenir le curseur? Ou est-ce qu'une bibliothèque peut faire ça?

Merci d'avance.

+1

Cela pourrait-il être utile? http://stackoverflow.com/questions/918990/c-capturing-the-mouse-cursor-image –

+0

Super! Merci, c'est bon. – KenC

Répondre

2

Après votre BitBlt et avant de sélectionner le bitmap arrière de hdcMem, vous pouvez le faire:

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

Le code figure ci-dessus si le curseur est affiché, en utilisant l'état global du curseur puisque vous êtes probablement prendre une capture d'écran d'une fenêtre (ou des fenêtres) dans un autre processus. Il obtient ensuite les coordonnées de la fenêtre cible pour l'ajustement à partir de l'écran. Il obtient des informations spécifiques sur le curseur, y compris son hotspot. Il calcule la position de dessin de l'icône. Enfin, il obtient la taille réelle de l'icône du curseur afin qu'il puisse le dessiner sans étirement.

Les seules limites à cette approche que je connaisse sont:

  • Vous ne recevez pas d'ombres de curseur si vous les avez activés.
  • S'il s'agit d'un curseur animé, cela affiche simplement la première image. Autant que je sache, il n'y a aucun moyen de déterminer le cadre actuel.
Questions connexes