WinAPI obtenir l’icône du curseur de la souris

Je veux obtenir l’icône du curseur dans Windows. Je pense que le langage que j’utilise n’est pas très important ici, alors je vais juste écrire du pseudo-code avec les fonctions WinAPI que j’essaie d’utiliser:

c = CURSORINFO.new(20, 1, 1, POINT.new(1,1)); GetCursorInfo(c); #provides correctly filled structure with hCursor DrawIcon(GetWindowDC(GetForegroundWindow()), 1, 1, c.hCursor); 

Donc, cette partie fonctionne bien, elle dessine le curseur actuel sur la fenêtre active. Mais ce n’est pas ce que je veux. Je veux obtenir un tableau de pixels, je devrais donc le dessiner en mémoire.

J’essaie de le faire comme ça:

 hdc = CreateCompatibleDC(GetDC(0)); #returns non-zero int canvas = CreateCompatibleBitmap(hdc, 256, 256); #returns non-zero int too c = CURSORINFO.new(20, 1, 1, POINT.new(1,1)); GetCursorInfo(c); DrawIcon(hdc, 1, 1, c.hCursor); #returns 1 GetPixel(hdc, 1, 1); #returns -1 

Pourquoi GetPixel () ne renvoie-t-il pas COLORREF? Qu’est-ce que je rate?

Je ne suis pas très expérimenté avec WinAPI, alors je fais probablement une erreur stupide.

Vous devez sélectionner le bitmap que vous créez dans le contexte du périphérique. Sinon, la fonction CLR_INVALID renverra CLR_INVALID (0xFFFFFFFF):

Un bitmap doit être sélectionné dans le contexte du périphérique, sinon CLR_INVALID est renvoyé sur tous les pixels.

De plus, le pseudo-code que vous avez montré fait fuir les objects. Chaque fois que vous appelez GetDC , vous devez appeler ReleaseDC lorsque vous avez fini de l’utiliser. Et chaque fois que vous créez un object GDI, vous devez le détruire lorsque vous avez fini de l’utiliser.

Enfin, vous semblez supposer que les coordonnées du point d’origine, c’est-à-dire le point supérieur gauche, sont (1, 1). Ils sont en fait (0, 0).

Voici le code que je voudrais écrire (vérification des erreurs omise pour des raisons de concision):

 // Get your device contexts. HDC hdcScreen = GetDC(NULL); HDC hdcMem = CreateCompatibleDC(hdcScreen); // Create the bitmap to use as a canvas. HBITMAP hbmCanvas = CreateCompatibleBitmap(hdcScreen, 256, 256); // Select the bitmap into the device context. HGDIOBJ hbmOld = SelectObject(hdcMem, hbmCanvas); // Get information about the global cursor. CURSORINFO ci; ci.cbSize = sizeof(ci); GetCursorInfo(&ci); // Draw the cursor into the canvas. DrawIcon(hdcMem, 0, 0, ci.hCursor); // Get the color of the pixel you're interestd in. COLORREF clr = GetPixel(hdcMem, 0, 0); // Clean up after yourself. SelectObject(hdcMem, hbmOld); DeleteObject(hbmCanvas); DeleteDC(hdcMem); ReleaseDC(hdcScreen); 

Mais une dernière mise en garde – la fonction DrawIcon fonctionnera probablement pas comme prévu. Il se limite à dessiner une icône ou un curseur à la taille par défaut. Sur la plupart des systèmes, ce sera 32×32. De la documentation:

DrawIcon dessine l’icône ou le curseur en utilisant la largeur et la hauteur spécifiées par les valeurs mésortingques du système pour les icons; Pour plus d’informations, voir GetSystemMesortingcs .

Au lieu de cela, vous souhaiterez probablement utiliser la fonction DrawIconEx . Le code suivant dessine le curseur à la taille réelle de la ressource:

 DrawIconEx(hdcMem, 0, 0, ci.hCursor, 0, 0, 0, NULL, DI_NORMAL);