Simuler un clic via les coordonnée X et Y

Résolu
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010 - 10 nov. 2010 à 18:15
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010 - 1 déc. 2010 à 21:27
Bonjour,
Je souhaiterais simuler un clic gauche, par exemple sur ma calculatrice windows, SANS récupérer son handle, mais grâce à sa position X et Y:
Donc, je vais dans la Faq delphi, puis j'adapte mon code :

Code :
begin
  SetCursorPos(1773, 191);
  {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 }
end;

Oui, sauf que mon curseur se déplace bien à l'endroit voulu, mais PAS DE CLIC.
En somme, je n'arrive pas à simuler un clic gauche, çe code ne fonctionne pas pour moi.
ps: mon os est windows Seven.
Si quelqu'un pourrais m'éclairer, çe serais cool, parce que là, je sèche...
merci
Je souhaite aussi rajouter que j'ai même placer ce code dans un composant timer...

14 réponses

yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
1 déc. 2010 à 21:27
Sujet résolue, il fallait tous simplement le lancer en mode administrateur, ce qui explique son bon fonctionnement en mode sans échecs.
Voilà, merci quand même.
3
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
10 nov. 2010 à 21:32
Bon, du nouveau :

ce code ne fonctionne pas, mais lorsque je l'execute en mode sans échecs, il fonctionne parfaitement.
Pourquoi ne fonctionne t-il pas sur ma session normale, et qu'il fonctionne en mode sans echecs?
merci.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
11 nov. 2010 à 10:23
Salut,

[quote=YannFrance]ce code ne fonctionne pas, mais lorsque je l'execute en mode sans échecs, il fonctionne parfaitement. /quote
tu veux sans doute dire en mode Debug !!

essayes avec une micro-pause entre le "DOWN" & "UP"
mouse_event(MOUSEEVENTF_LEFTDOWN, 0,0 ,0,0);
Sleep(250);
mouse_event(MOUSEEVENTF_LEFTUP, 0,0 ,0,0);

ça devrait fonctionner.

[hr]@+Cirec
[hr]
0
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
11 nov. 2010 à 16:45
Merci Cirec,

L'idée d'une pause entre chaque instructions, je l'avais déjà tester, mais rien...
Ensuite, quand je dit en mode sans échecs, c'est bien l'option de démarrage du système d'exploitation, en l'occurrence, windows 7 et non celui de l'edi.
merci.
autre choses ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
11 nov. 2010 à 18:59
[quote= YannFrance]Ensuite, quand je dit en mode sans échecs, c'est bien l'option de démarrage du système d'exploitation, en l'occurrence, windows 7 et non celui de l'edi./quoteAh bon !

D'après la MSDN
mouse_event a été remplacée par SendInput ...

essayes ce code et dis moi si ça fonctionne ... (j'ai pas Seven sous la main)
[hr] procedure  TMainfrm.Button4Click(Sender: TObject);

var InputArray : array of TInput;   // Tableau de TInput
    MouseInput : TMouseInput;      // MouseInput structure
[b]begin
    /b{Défini la taille du Tableau}
  SetLength(InputArray, 2);
    {rempli de zéro la structure}
  ZeroMemory(@MouseInput, SizeOf(TMouseInput));

    {défini les coordonées et les Flags}
  MouseInput.dx : = 1773 * (65335 div Screen.Width);
  MouseInput.dy :=   191 * (65335  div  Screen.Height);
  MouseInput.dwFlags : =  MOUSEEVENTF_MOVE or MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN;
    [i]{et on l'affecte au premier indice du tableau}
  /iInputArray[0].Itype := INPUT_MOUSE;
  InputArray[0].mi := MouseInput;

     {et on recommence}
  ZeroMemory(@MouseInput, SizeOf(TMouseInput));
  MouseInput.dwFlags : = MOUSEEVENTF_LEFTUP;

  InputArray[1].Itype := INPUT_MOUSE;
  InputArray[1].mi := MouseInput;
    {et pour finir on appel la fonction SendInput}
  if SendInput(Length(InputArray), InputArray[0], SizeOf(TINPUT)) < Length(InputArray) [b]then
    /bShowMessage(SysErrorMessage(GetLastError));
end;
[hr]


[hr]@+Cirec
[hr]
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
11 nov. 2010 à 19:44
petite correction sur le contrôle de la valeur de sortie de SendInput .. pour supprimer un message d'avertissement du compilateur et ...:
[hr]procedure TMainfrm.Button4Click(Sender: TObject);

var InputArray : array of TInput;  // Tableau de TInput
    MouseInput : TMouseInput;      // MouseInput structure
[b]begin
    /b{Défini la taille du Tableau}
  SetLength(InputArray, 2); // 2 étant le nombre d'évènements souris
    {rempli de zéro la structure}
  ZeroMemory(@MouseInput, SizeOf(TMouseInput));

    {défini les coordonées et les Flags}
  MouseInput.dx :=  1773 * (MAXWORD  div  Screen.Width);
  MouseInput.dy : = 0191 * (MAXWORD div Screen.Height);
  MouseInput.dwFlags :=   MOUSEEVENTF_MOVE  or  MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN;
    [i]{et on l'affecte au premier indice du tableau}
  /iInputArray[0].Itype : = INPUT_MOUSE;
  InputArray[0].mi := MouseInput;

     {et on recommence}
  ZeroMemory(@MouseInput, SizeOf(TMouseInput));
  MouseInput.dwFlags : = MOUSEEVENTF_LEFTUP;

  InputArray[1].Itype := INPUT_MOUSE;
  InputArray[1].mi := MouseInput;
    {et pour finir on appel la fonction SendInput}
  if SendInput(Length(InputArray), InputArray[0], SizeOf(TINPUT)) < Cardinal(Length(InputArray)) [b]then
    /bShowMessage(SysErrorMessage(GetLastError));
end;
[hr]


[hr]@+Cirec
[hr]
0
beckerich Messages postés 302 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 17 septembre 2013 2
11 nov. 2010 à 19:54
Bonsoir,

j'y comprends rien sur ce coup là, comment peut-on envoyer un message à une fenêtre sans en connaître le handle. Pour moi, quand une fenêtre est positionnée dirons-nous (100, 150, 100, 100) soit 100 pixels de la gauche, 150 pixels du haut, 100 et 100 pixels de largeur et de hauteur, si je poste un message de position -100, -50, alors la procédure de fenêtre reçoit le message avec les coordonnées hors de la fenêtre visible, mais pas avec les coordonnées d'une autre fenêtre !!!
Dites-moi si je dois revoir mes base Windows (j'ai étudié le système avec Prezold sur Win 3.0), je vieillis mal ou quoi ???

Bonne soirée.

Luc
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
11 nov. 2010 à 20:50
@beckerich:

attention tu confonds ... ici on envoie pas de message donc pas besoin de Handle on ne fait que simuler une action souris ... une position (Absolue) et un LDOWN suivi d'un LUP

c'est comme si l'utilisateur avait déplacé la souris et cliqué à cette endroit.


[hr]@+Cirec
[hr]
0
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
11 nov. 2010 à 21:39
Merci Cirec,

Non, ce code ne fait rien de spécial, désoler.
Chez toi ça fonctionne ?
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
11 nov. 2010 à 21:47
Non, ce code ne fait rien de spécial, désoler.
Chez toi ça fonctionne ?

ben oui ça fonctionne très bien !!
mais j'ai pas seven

et il se passe rien du tout ?
même pas un message d'erreur !?
la souris bouge au moins ?


[hr]@+Cirec
[hr]
0
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
12 nov. 2010 à 15:38
nn, la souris ne bouge pas, et j'ai pas de message d'erreur, il y'as juste une boite de dialogue qui apparait pour me dire que l'opération à réussi, mais rien du tous se passe.
Voilà..
merci
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
12 nov. 2010 à 17:08
bon je viens de tester sous Seven ... et ça fonctionne parfaitement ... que le code soit compilé sous Delphi-7 où Delphi-2009 la souris se déplace au bon endroit et le click se fait !!!


[hr]@+Cirec
[hr]
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
12 nov. 2010 à 18:16
Salut,

Même avec mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0) et mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0) ça fonctionne très bien...

@yannfrance
Ca vient sans doute de l'OS. Il faudrait sans doute vérifier la configuration de ton Seven puisque ça marche en mode sans échec...
0
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
12 nov. 2010 à 18:27
Oui Caribensila,
Je le sais que le problème viens de la config de mon os,
j'ai essayer de réstaurer la configuration de démarrage ainsi que les services, mais rien y fait, à part ça, je ne vois plus quoi faire...
Tous seul dans ce cas, aucun doute.
Je ne veut pas m'avancer dans un formatage, trop fastidieux...
Tant pis, vraiment casse pied ce souci.
merci quand-même pour votre aide.
0
Rejoignez-nous