Simuler un clic via les coordonnée X et Y [Résolu]

yannfrance 50 Messages postés mardi 18 septembre 2007Date d'inscription 1 décembre 2010 Dernière intervention - 10 nov. 2010 à 18:15 - Dernière réponse : yannfrance 50 Messages postés mardi 18 septembre 2007Date d'inscription 1 décembre 2010 Dernière intervention
- 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...
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
yannfrance 50 Messages postés mardi 18 septembre 2007Date d'inscription 1 décembre 2010 Dernière intervention - 1 déc. 2010 à 21:27
3
Merci
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.

Merci yannfrance 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

Commenter la réponse de yannfrance
yannfrance 50 Messages postés mardi 18 septembre 2007Date d'inscription 1 décembre 2010 Dernière intervention - 10 nov. 2010 à 21:32
0
Merci
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.
Commenter la réponse de yannfrance
Cirec 4224 Messages postés vendredi 23 juillet 2004Date d'inscription 5 juin 2018 Dernière intervention - 11 nov. 2010 à 10:23
0
Merci
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]
Commenter la réponse de Cirec
yannfrance 50 Messages postés mardi 18 septembre 2007Date d'inscription 1 décembre 2010 Dernière intervention - 11 nov. 2010 à 16:45
0
Merci
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 ?
Commenter la réponse de yannfrance
Cirec 4224 Messages postés vendredi 23 juillet 2004Date d'inscription 5 juin 2018 Dernière intervention - 11 nov. 2010 à 18:59
0
Merci
[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]
Commenter la réponse de Cirec
Cirec 4224 Messages postés vendredi 23 juillet 2004Date d'inscription 5 juin 2018 Dernière intervention - 11 nov. 2010 à 19:44
0
Merci
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]
Commenter la réponse de Cirec
beckerich 309 Messages postés jeudi 29 septembre 2005Date d'inscription 17 septembre 2013 Dernière intervention - 11 nov. 2010 à 19:54
0
Merci
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
Commenter la réponse de beckerich
Cirec 4224 Messages postés vendredi 23 juillet 2004Date d'inscription 5 juin 2018 Dernière intervention - 11 nov. 2010 à 20:50
0
Merci
@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]
Commenter la réponse de Cirec
yannfrance 50 Messages postés mardi 18 septembre 2007Date d'inscription 1 décembre 2010 Dernière intervention - 11 nov. 2010 à 21:39
0
Merci
Merci Cirec,

Non, ce code ne fait rien de spécial, désoler.
Chez toi ça fonctionne ?
Commenter la réponse de yannfrance
Cirec 4224 Messages postés vendredi 23 juillet 2004Date d'inscription 5 juin 2018 Dernière intervention - 11 nov. 2010 à 21:47
0
Merci
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]
Commenter la réponse de Cirec
yannfrance 50 Messages postés mardi 18 septembre 2007Date d'inscription 1 décembre 2010 Dernière intervention - 12 nov. 2010 à 15:38
0
Merci
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
Commenter la réponse de yannfrance
Cirec 4224 Messages postés vendredi 23 juillet 2004Date d'inscription 5 juin 2018 Dernière intervention - 12 nov. 2010 à 17:08
0
Merci
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]
Commenter la réponse de Cirec
Caribensila 2674 Messages postés jeudi 15 janvier 2004Date d'inscription 11 mai 2018 Dernière intervention - 12 nov. 2010 à 18:16
0
Merci
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...
Commenter la réponse de Caribensila
yannfrance 50 Messages postés mardi 18 septembre 2007Date d'inscription 1 décembre 2010 Dernière intervention - 12 nov. 2010 à 18:27
0
Merci
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.
Commenter la réponse de yannfrance

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.