Des clicks qui n'utilisent pas votre souris

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

Bit-X

V
Jan 11, 2012
703
1
924
Dans un livre
Discord
kolibry#8414
(Amateur) Des clicks qui n'utilisent pas votre souris

Voici un petit tutoriel en 10 étapes pour que votre bot / simulateur de click ne bloque pas votre souris. C'est à dire, un click ciblé dans une fenêtre.

Vous me direz bien sure , il y a une fonction (ControlClick) intégré dans AutoIt.
Je vais vous répondre dessuite, cette fonction ne marche pas pour tout les jeux / fenêtre.

Pour continuer, vous devez être sous Windows car ce Tutoriel utilise une dll originaire by Windows.

Commençons...

1. Tout d'abord, on créer une fonction qui portera un nom plutot bien défini, ici ça sera Win_Click()
PHP:
Func Win_Click()
	
EndFunc


2. On donne une place pour nos argument utiles lors de l'appel de cette fonction. Nous aurons besoin de 5 arguments:
$Title pour le nom de la fenêtre.
$iButton pour définir le type de click (gauche ou droite)
$X et $Y pour la position du click
$iClicks pour le nombre de clicks (permet le double click...)
PHP:
Func Win_Click($Title, $iButton = "left", $X = "", $Y = "", $iClicks = 1)
	
EndFunc

3. On déclare nos variables. $Full et $HWnD permettent d'obtenir l'identifiant réel de la fenêtre ciblé. Les lignes suivantes définissent les valeur utiles pour l'appel de notre dll, on vera ça plus loin.
PHP:
Func Win_Click($Title, $iButton = "left", $X = "", $Y = "", $iClicks = 1)
	Local $Full = WinGetTitle ($Title)
	Local $HWnD = WinGetHandle ($Full)
	Local $MK_LBUTTON       =  0x0001
	Local $WM_LBUTTONDOWN   =  0x0201
	Local $WM_LBUTTONUP     =  0x0202
	Local $MK_RBUTTON       =  0x0002
	Local $WM_RBUTTONDOWN   =  0x0204
	Local $WM_RBUTTONUP     =  0x0205
	Local $WM_MOUSEMOVE     =  0x0200
	Local $i                = 0
	Local $Button,$ButtonDown,$ButtonUp,$MouseCoord

EndFunc

4. On créer une condition (If - EndIf) qui vérifie l'existance de la fenêtre, histoire de ne pas créer d'erreur. Aucun commentaire ici car vous devez connaitre ces fonctions.
PHP:
If IsHWnD ($HWnD) And WinExists ($Full) <> 0 Then

EndId

Ce qui nous donne :
PHP:
Func Win_Click($Title, $iButton = "left", $X = "", $Y = "", $iClicks = 1)
	Local $Full = WinGetTitle ($Title)
	Local $HWnD = WinGetHandle ($Full)
	Local $MK_LBUTTON       =  0x0001
	Local $WM_LBUTTONDOWN   =  0x0201
	Local $WM_LBUTTONUP     =  0x0202
	Local $MK_RBUTTON       =  0x0002
	Local $WM_RBUTTONDOWN   =  0x0204
	Local $WM_RBUTTONUP     =  0x0205
	Local $WM_MOUSEMOVE     =  0x0200
	Local $i                = 0
	Local $Button,$ButtonDown,$ButtonUp,$MouseCoord
	If IsHWnD ($HWnD) And WinExists ($Full) <> '0' Then
		
	EndIf
EndFunc

Pour limité la répétition de code, tout ce qui suit ce trouve dans la condition précédente (If - EndIf).
5. On tranche $iButton pour définir le type de click à effectuer.
PHP:
		Select
		Case $iButton = "left"
		   $Button     =  $MK_LBUTTON
		   $ButtonDown =  $WM_LBUTTONDOWN
		   $ButtonUp   =  $WM_LBUTTONUP
		Case $iButton = "right"
		   $Button     =  $MK_RBUTTON
		   $ButtonDown =  $WM_RBUTTONDOWN
		   $ButtonUp   =  $WM_RBUTTONUP
		EndSelect

6. Pour éviter un mauvais click, on vérifie la valeur de $X et $Y. Si aucune valeur est entré, c'est la position du curseur au moment de l'appel qui sera défini.
PHP:
		If $X = "" OR $Y = "" Then
		   $MouseCoord = MouseGetPos()
		   $X = $MouseCoord[0]
		   $Y = $MouseCoord[1]
		EndIf

7. On créer une boucle (For - Next) qui a pour valeur maximum, le nombre de clicks à effectuer.
Je ne commente pas la partie de l'appel de la dll.
PHP:
		For $i = 1 to $iClicks
		   DllCall("user32.dll", "int", "SendMessage","hwnd",$HWnD,"int",$WM_MOUSEMOVE,"int",0,"long",_MakeLong($X, $Y))
		   DllCall("user32.dll", "int", "SendMessage","hwnd",$HWnD,"int",$ButtonDown,"int",$Button,"long",_MakeLong($X, $Y))
		   DllCall("user32.dll", "int", "SendMessage","hwnd",  $HWnD,"int",$ButtonUp,"int",   $Button,"long",  _MakeLong($X, $Y))
		Next

8. Votre fonction doit ressembler à cela:
PHP:
Func Win_Click($Title, $iButton = "left", $X = "", $Y = "", $iClicks = 1)
	Local $Full = WinGetTitle ($Title)
	Local $HWnD = WinGetHandle ($Full)
	Local $MK_LBUTTON       =  0x0001
	Local $WM_LBUTTONDOWN   =  0x0201
	Local $WM_LBUTTONUP     =  0x0202
	Local $MK_RBUTTON       =  0x0002
	Local $WM_RBUTTONDOWN   =  0x0204
	Local $WM_RBUTTONUP     =  0x0205
	Local $WM_MOUSEMOVE     =  0x0200
	Local $i                = 0
	If IsHWnD ($HWnD) And WinExists ($Full) <> '0' Then
		Select
		Case $iButton = "left"
		   $Button     =  $MK_LBUTTON
		   $ButtonDown =  $WM_LBUTTONDOWN
		   $ButtonUp   =  $WM_LBUTTONUP
		Case $iButton = "right"
		   $Button     =  $MK_RBUTTON
		   $ButtonDown =  $WM_RBUTTONDOWN
		   $ButtonUp   =  $WM_RBUTTONUP
		EndSelect

		If $X = "" OR $Y = "" Then
		   $MouseCoord = MouseGetPos()
		   $X = $MouseCoord[0]
		   $Y = $MouseCoord[1]
		EndIf

		For $i = 1 to $iClicks
		   DllCall("user32.dll", "int", "SendMessage","hwnd",$HWnD,"int",$WM_MOUSEMOVE,"int",0,"long",_MakeLong($X, $Y))
		   DllCall("user32.dll", "int", "SendMessage","hwnd",$HWnD,"int",$ButtonDown,"int",$Button,"long",_MakeLong($X, $Y))
		   DllCall("user32.dll", "int", "SendMessage","hwnd",  $HWnD,"int",$ButtonUp,"int",   $Button,"long",  _MakeLong($X, $Y))
		Next
	EndIf
EndFunc

9. Dans l'appel de notre dll, on peut remarquer "_MakeLong($X,$Y)". Je vais donc vous donner cette petite fonction qui est à placer juste après la première fonction (Win_Click())
PHP:
Func _MakeLong($LoWord,$HiWord)
    Return BitOR($HiWord * 0x10000, BitAND($LoWord, 0xFFFF))
EndFunc

10. Et voila !
Vous pouvez maintenant effectuer un click dans une fenêtre ciblé de la manière suivante.
PHP:
Win_Click("MaFenetre","left",452,256,2)

Petite précision, le point 0x0 ne se situe pas en haut à gauche à l'exterieur de la fenêtre.. mais à l'interrieur. C'est à dire après la marge x et la marge y du thème.
tuto_winclick0001.png



Un petit merci ne coûte rien ! ;)

A bientôt pour de nouvelles aventures !!
 
Last edited:
  • Like
Reactions: Hadory

Bit-X

V
Jan 11, 2012
703
1
924
Dans un livre
Discord
kolibry#8414

Bit-X

V
Jan 11, 2012
703
1
924
Dans un livre
Discord
kolibry#8414
Un programme AutoIt peut devenir "Casi" aussi complet que n'importe quel programme grâce à l'utilisation des dll.

Je ferais un petit cours sur les Sockets avec AutoIt.
 

Bit-X

V
Jan 11, 2012
703
1
924
Dans un livre
Discord
kolibry#8414

Oui, mais ce n'est pas aussi efficasse.
Si tu es "Expert" en AutoIt, tu comprendra très vite l'utilité de ce TuTo...
Je ne connai pas de fonction AutoIt permettant MouseMove ou MouseClickDrag dans une fenêtre ciblé ^^. Hors, avec User32.dll c'est possible !

Ensuite, pas toutes les fenêtres prennent en compte ControlClick.
Si je ne me trompe, avec Diablo II par exemple, ControlClick ne marche pas.
 
Last edited:

Drakka

Nouveau membre
Pas encore tester mais sa à l'air fonctionnel , vu qu'on t'as répondu.

Merci du partage ! C'est super-utile sa !

Je me permet de rajouter un truc , la fenêtre 'cible' n'est pas obligatoirement en premier-plan. Essayer lancer Firefox et laisser le sur la page d'accueil Google , sans AutoIt paramétrer la fonction comme telle :

Code:
Win_Click("Google - Mozilla Firefox","right",452,256,1)

Et la bande déroulante , apparaît à travers AutoIt.
Fonction géniale , si c''est toi qui l'as trouver ... chapeau
 
Last edited:
Jan 6, 2010
1,308
0
942
Non loin de ce forum
Salut Bit-X,

je trouve ton tutoriel plus qu'intéressant cependant, je pense que je vais avoir un problème. Vois-tu, je suis en train de développer une nouvelle version de mon bot à l'aide de ta fonction mais voilà le hick ! Les personnes qui utiliseront le bot seront susceptibles d'avoir plusieurs clients de jeux ouverts et jusqu'à preuve du contraire, les fenêtres ne changent pas de nom. Si ta fonction doit avoir le titre de la fenêtre, il est donc évident qu'il y aura quelques soucis, j'me trompe ?

En attente de ta réponse, je te félicite et remercie en tout cas !
 
Mar 30, 2011
1,014
1
944
In Your Ass
Salut Bit-X,

je trouve ton tutoriel plus qu'intéressant cependant, je pense que je vais avoir un problème. Vois-tu, je suis en train de développer une nouvelle version de mon bot à l'aide de ta fonction mais voilà le hick ! Les personnes qui utiliseront le bot seront susceptibles d'avoir plusieurs clients de jeux ouverts et jusqu'à preuve du contraire, les fenêtres ne changent pas de nom. Si ta fonction doit avoir le titre de la fenêtre, il est donc évident qu'il y aura quelques soucis, j'me trompe ?

En attente de ta réponse, je te félicite et remercie en tout cas !

tu passe le handle de la fenetre en paramètre a envoyer a la fonction a la place du nom de fenetre et c est regler
 

Bit-X

V
Jan 11, 2012
703
1
924
Dans un livre
Discord
kolibry#8414
Tu as deux solution, soit celle énoncé par Casimir, soit tu renomme chaque fenêtre avec un nom différent.

Renommer un fenêtre:
PHP:
WinSetTitle("Titre_de_fenetre","","Nouveau_Titre")

Récupérer l'ID d'un fenêtre :
PHP:
$Mavariable=WinGetHandle("Titre_de_fenetre")
 
Jan 6, 2010
1,308
0
942
Non loin de ce forum
Je comprend pas ton problème , si justement le nom de la fenêtre ne change pas , alors quel est le problème ?

Bah si il y a plusieurs fenêtres avec le même titre d'ouvert, ça engendra forcément des soucis, c'était ça le blême.

Pour ce qui est du bot, j'ai réadapté le code source et je pense que ta fonction n'est pas compatible avec le jeu. Cela ne vient pas de la fonction mal retranscrite car j'ai fais un prog test et elle marche à merveille, mais sur le jeu ça marche pas.

Si tu veux vérifier (d'ailleurs ça serait pas plus mal), tu pourras télécharger TeamViewer histoire qu'on se donne "RDV", là je suis un peu occupé mais peut être à l'avenir.

L'idée de récupérer l'ID de la fenêtre ou même changer le titre (je pensais pas que c'était possible) restent de très bonnes idées, je mes ça en réserve et vous remercie.

A plus !
 
Jan 6, 2010
1,308
0
942
Non loin de ce forum

Juk33

Nouveau membre
May 6, 2012
2
0
301
Salut,

J'ai quelques petits soucis avec ton code, je tente de l'utiliser avec Wakfu mais lorsque je l’exécute rien ne ce passe, je l'appel ainsi :
Win_Click("WAKFU","left",100,100)

De plus je voudrais savoir si avec cette méthode il était possible d'utiliser le pixelSearch étant donné que l'on est pas dans une fenêtre "active" ?
-> Trouvé, la fonction contient un paramètre à renseigner pour cela.

Merci d'avance pour vos réponses :)
 
Last edited:

stephaudi7

Membre
Apr 28, 2012
91
0
306
Bonjour je cherche un programmateur de script ou me dire comment programmer un script pour anic bot dofus merci (si quelqun peut me mp va skype,mns ou m'envoyer un mesage priver sur ce forum merci)
 

Sauvegarde

Nouveau membre
Feb 21, 2013
2
0
901
33
C'est à dire ? Comment peut-on envoyer un message à une application sans utiliser de handle ?
 

SonGoku

Je suis Légendaire
V
Ancien staff
Mar 27, 2011
6,130
75
954
Alpha
Un HANDLE est une valeur numérique correspondant à une fenêtre . C'est grâce au HANDLE que tu peux manipuler une fenêtre quand tu lui envoies un message style SendMessage ou PostMessage et d'autres API aussi .

Cordialement SonGoku
 

gregleboss

Membre
Apr 3, 2011
9
0
421
Bonjour, merci pour ce tuto super utile mais il manque juste un détail à mon gout :
comment connaitre les coordonnées du curseur relativement à la fenêtre (avec le décalage en haut à gauche) comme avec la fonction MouseGetPos ?
 

titiller

Membre
Jan 7, 2010
67
1
909
Je n'arrive pas à faire marcher la fonction sur un site en particulier sur Mozilla Firefox, ca marche sur nimporte quel site, sauf quand je rentre sur mon jeu flash en question et que je me connecte au jeu :(Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!)
Sur le site en lui même ca marche, c'est seulement à partir de la connexion au jeu que ça ne marche plus...
J'ai aussi remarquer avec AutoIt v3 Window Info, que lorsque je ne suis pas dans le jeu, quand j'analyse la page, il n'y a pas de ClassControl et dans l'onglet Control tout est vide, alors que quand je rentre dans le jeu, et que je re analyse la page, l'onglet control se remplit et une classcontrol apparait : GeckoFPSandboxChilWindow...
Je sais pas si c'est lié, mais en tout cas je n'arrive pas à faire marcher AutoIt lorsque je rentre dans le jeu...
J'ai aussi remarqué que la page de Mozilla Firefox n'avait pas d'ID..
Avec les autres navigateurs ca marche bien .. ( Opéra, Google Chrome)..

Quelqu'un pourrait m'aider ?

Merci d'avance !
 
Last edited:

Bryant

Membre actif
Feb 27, 2011
240
3
924
Bonjour , merci en tout cas malheureusement , dans mon cas les cliques fonctionne mais sur Dofus 1.29 ps vraiment , le problème viens du fiat que quand tu clique sur un pnj tu as une miniboite "parler" qui s'affiche et quand on entre la pos x,y , le clique s'effectue derrière cette boite ... quelqu'un a une solution ?
 

Boukeke

Nouveau Marchand
Nov 24, 2016
51
3
579
74
J'ai essayer de le faire pour dofus 1.29 aussi comme mon vdd, mais sans grand succès :/, si vous avez réussi à résoudre le problème, je serais ravi de connaître la solution
 

HollyMolly

Membre
Mar 4, 2019
21
1
24
24
Le problème viens du fait que quand tu clique sur un pnj tu as une miniboite "parler" qui s'affiche et quand on entre la pos x,y , le clique s'effectue derrière cette boite ... quelqu'un a une solution ?

C'est parce que la mini-boîte en question doit être un control. Si c'est le cas, il est bon de savoir qu'un control est un enfant de la fenêtre parente et a un handle qui lui est propre. J'image mes propos ici même :
Exempleexplicationsendmessage


La solution est donc d'utiliser le handle du control sur lequel vous souhaitez cliquer (en l'occurence, la mini-boîte).

Si vous utilisez un autre language qu'Autoit (notemment pour le multi-threading), pour connaître le handle d'un control enfant il faut utiliser la fonction "FindWindowEx" (Allias "FindWindowExA") de Win32.dll. Je vous laisse le lien du msdn : Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!