- Comment connaître la position de la souris ?
- Comment simuler un clic de souris ?
- Comment tester l'état d'un bouton ou d'une touche ?
- Com+ment récupérer la position du Hotspot d'un curseur ?
- Comment récupérer l'image d'un curseur dans un TBitmap ?
Pour connaître la position de la souris, il suffit d'utiliser la procédure GetCursorPos (var P : TPoint).
Code delphi : | Sélectionner tout |
1
2 3 4 5 6 7 |
var Position: TPoint; begin GetCursorPos(Position); Showmessage('Les coordonnées de la souris sont X: ' + IntToStr(Position.X) + ' et Y: ' + IntToStr(Position.Y)); end; |
Il suffit de déplacer la souris, faire croire à Windows que le bouton est appuyé, puis relâcher et remettre (ou pas) le curseur en place. Voici comment faire :
Code delphi : | Sélectionner tout |
1
2 3 4 5 6 7 8 9 10 11 12 13 14 |
var MyPoint: TPoint; begin GetCursorPos(MyPoint); {Récupère la position du curseur } SetCursorPos(300, 200); {Positionne le curseur sur la fiche } mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); {Simule l'action de clic du bouton gauche de la souris } mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); {Simule l'action de relâcher du bouton gauche de la souris } SetCursorPos(MyPoint.X, MyPoint.Y); {Repositionne le curseur à sa position d'origine } end; |
- MOUSEEVENTF_RIGHTDOWN et MOUSEEVENTF_RIGHTUP pour provoquer des clics droits ;
- MOUSEEVENTF_MIDDLEDOWN et MOUSEEVENTF_MIDDLEUP pour provoquer un clic du bouton du milieu ;
- MOUSEEVENTF_MOVE pour faire croire que la souris a bougé sans la faire bouger ;
- MOUSEEVENTF_WHEEL pour faire croire que la molette a bougé (sans indication de sens).
Il est possible de tester à tout moment l'état d'une touche du clavier ou d'un bouton de la souris grâce à la fonction API :
Code Delphi : | Sélectionner tout |
function GetAsyncKeyState(vKey: Integer): SHORT; stdcall;
Par exemple, pour tester l'état du bouton gauche de la souris :
Code Delphi : | Sélectionner tout |
1
2 3 4 5 6 |
procedure TForm1.Timer1Timer(Sender: TObject); begin If (GetAsyncKeyState(VK_LBUTTON)And $8000)<>0 Then Label1.Caption := 'Enfoncé' Else Label1.Caption := 'Relâché'; end; |
Pour récupérer la position du Hotspot d'un curseur, on utilise la méthode GetIconInfo.
Code delphi : | Sélectionner tout |
1
2 3 4 5 6 7 8 9 10 11 12 13 |
function GetHotSpot(CursorIndex:TCursor):TPoint; var iconInfo: TIconInfo; begin if GetIconInfo(Screen.Cursors[CursorIndex], iconInfo) then try Result.X:=iconInfo.xHotspot; Result.Y:=iconInfo.yHotspot; finally DeleteObject(IconInfo.hbmColor); DeleteObject(IconInfo.hbmMask); //Ces 2 membres sont créés par l'appel à GetIconInfo. Il faut donc les supprimer. end; end; |
Pour cela, on dessine le curseur récupéré sur le TBitmap à l'aide de la méthode DrawIconEx.
Code delphi : | Sélectionner tout |
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
procedure CursorToBitmap(CursorIndex:TCursor;var ABmp:TBitmap); var hCursor: THandle; begin ABmp.Width := 32; ABmp.Height := 32; ABmp.PixelFormat := pf24bit; // pour éviter de travailler avec les palettes hCursor := Screen.Cursors[CursorIndex]; DrawIconEx(ABmp.Canvas.Handle, 0,0, hCursor, 32,32, 0,0, DI_NORMAL); // Remplissage du curseur depuis "l'extérieur" de telle façon qu'un curseur blanc // apparaisse blanc. on suppose que le coin supérieur droit sera le point de départ du remplissage // On suppose que RGB(250,250,250) sera la couleur de "transparence". ABmp.Canvas.Brush.Color := RGB(250,250,250); ABmp.Canvas.FloodFill(31,0, clWhite, fsSurface); // Le coin supérieur gauche de certains curseurs est "bloqué" contre le floodfill ABmp.Canvas.FloodFill(0,0, clWhite, fsSurface); end; |
Exemple d'utilisation dans le OnClick d'un TButton :
Code delphi : | Sélectionner tout |
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
procedure TForm1.Button1Click(Sender: TObject); var iconInfo: TIconInfo; abmp:tbitmap; begin abmp:=TBitmap.Create; try //On récupère mon Bitmap (en premier paramètre, //on indique quel curseur on souhaite : //crHandPoint, crHourGlass, crArrow, etc.) CursorToBitmap(crHandPoint,abmp); //On l'affiche sur la fiche Form1.Canvas.Draw(5,5,abmp); //ou le sauvegarde abmp.saveTofile('MonCurseur.bmp'); finally abmp.Free; end; end; |
Note : ce code nécessite l'ajout des unités Windows, Types, Forms et Graphics dans la clause uses