Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
La Vache En Liberté
Publicité
Visiteurs
Depuis la création 26 470
Newsletter
Archives
5 septembre 2019

Gérer la souris (Extrait faq developpez.com)

SommaireSystèmeSouris (5)


 

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;
Mis à jour le 18 octobre 2013 atlantis

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;
Il existe aussi les constantes :
  • 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).
Mis à jour le 18 octobre 2013 Al-Yazdi

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;
Cette fonction retourne l'état de la touche, le bit 15 du résultat est à 1 si la touche (ou le bouton) est actuellement enfoncée. Le test fonctionne aussi même si l'application n'est pas active. Le numéro de touche passé en paramètre doit être le code de touche virtuel. Delphi définit les constantes VK_xxxx pour chaque touche du clavier.

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;
Mis à jour le 18 octobre 2013 Nono40

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;
Note : ce code nécessite l'ajout des unités Windows, Types, Forms et Graphics dans la clause uses.
Mis à jour le 14 janvier 2014 Lung

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

Publicité
Publicité
Commentaires
Publicité