Capture Capture d'écran de curseur de la souris

voix
3

Je l'ai utilisé le code suivant pour obtenir capture d'écran sous 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);

Cependant, le curseur de la souris ne se présente pas.

Comment pourrais-je obtenir le curseur? ou est-il une bibliothèque peut le faire?

Merci d'avance.

Créé 27/10/2009 à 06:33
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
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 chiffres ci-dessus si le curseur est affiché, en utilisant l'état global du curseur puisque vous prenez probablement une capture d'écran d'une fenêtre (ou fenêtres) dans un autre processus. Il obtient alors la fenêtre cible les coordonnées pour le réglage de l'écran. Il obtient des renseignements précis sur le curseur, y compris son point d'accès. Il calcule la position de dessin de l'icône. Enfin, il obtient la taille réelle de l'icône du curseur pour qu'il puisse dessiner sans étirement.

Les seules limites à cette approche que je connaisse sont les suivants:

  • Vous ne recevez pas les ombres de curseur si vous les avez activé.
  • Si c'est un curseur animé, ce qui montre que la première image. Pour autant que je sache, il n'y a aucun moyen de déterminer le cadre actuel.
Créé 11/04/2014 à 13:36
source utilisateur

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