Des clicks qui n'utilisent pas votre souris

Publicités


Users who viewed this discussion (Total:0)

Des faux middlemans contactent les vendeurs et acheteurs. Veuillez rester vigilent pendant vos échanges. le Tag#0123 ne permet pas de confirmer l'identité d'un middleman. Utilisez la methode suivante: Confirmer l'identité d'une personne sur Discord

Les middlemans ne sécurisent PAS par message privé. Merci d'utiliser Market-Maker pour vos transactions avec Middleman: Utilisation de Market-Market

Le Discord officiel de Cheat-Gam3 est disponible ici: Invitation au serveur Discord (UID: 193050136392237066)


Bit-X

Membre reconnu
Inscrit
11 Janvier 2012
Messages
702
Best answers
0
J'aime
0
Points
582
#1
(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 !!
 
Dernière édition:

Cyrion

._.
Ancien staff
Programmeur
Inscrit
8 Juillet 2010
Messages
2 528
Best answers
0
J'aime
1
Points
764
#2
En gros , cette fonctions marche dans toute les fenêtres ET ne prend pas la souris ? :o
 
OP
OP
Bit-X

Bit-X

Membre reconnu
Inscrit
11 Janvier 2012
Messages
702
Best answers
0
J'aime
0
Points
582
#3
OP
OP
Bit-X

Bit-X

Membre reconnu
Inscrit
11 Janvier 2012
Messages
702
Best answers
0
J'aime
0
Points
582
#5
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.
 
OP
OP
Bit-X

Bit-X

Membre reconnu
Inscrit
11 Janvier 2012
Messages
702
Best answers
0
J'aime
0
Points
582
#9
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.
 
Dernière édition:

Drakka

Nouveau membre
Inscrit
15 Janvier 2010
Messages
3
Best answers
0
J'aime
0
Points
561
#10
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
 
Dernière édition:

itachi26

Membre reconnu
Inscrit
6 Janvier 2010
Messages
1 308
Best answers
0
J'aime
0
Points
601
#11
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 !
 

Cyrion

._.
Ancien staff
Programmeur
Inscrit
8 Juillet 2010
Messages
2 528
Best answers
0
J'aime
1
Points
764
#12
Je comprend pas ton problème , si justement le nom de la fenêtre ne change pas , alors quel est le problème ?
 

casimir

Membre reconnu
Inscrit
30 Mars 2011
Messages
1 019
Best answers
0
J'aime
0
Points
602
#13
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
 
OP
OP
Bit-X

Bit-X

Membre reconnu
Inscrit
11 Janvier 2012
Messages
702
Best answers
0
J'aime
0
Points
582
#14
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")
 

itachi26

Membre reconnu
Inscrit
6 Janvier 2010
Messages
1 308
Best answers
0
J'aime
0
Points
601
#15
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 !
 
OP
OP
Bit-X

Bit-X

Membre reconnu
Inscrit
11 Janvier 2012
Messages
702
Best answers
0
J'aime
0
Points
582
#16
Sur quel jeu cela ne fonctionne pas? As tu essayer en mettant "#RequireAdmin" au sommet de ton script?
 

itachi26

Membre reconnu
Inscrit
6 Janvier 2010
Messages
1 308
Best answers
0
J'aime
0
Points
601
#17

Juk33

Nouveau membre
Inscrit
6 Mai 2012
Messages
2
Best answers
0
J'aime
0
Points
301
#18
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 :)
 
Dernière édition:
Inscrit
28 Avril 2012
Messages
91
Best answers
0
J'aime
0
Points
306
#19
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)
 

SonGoku

Je suis Légendaire
Ancien staff
Inscrit
27 Mars 2011
Messages
6 057
Best answers
0
J'aime
23
Points
604
#25
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
 
Inscrit
3 Avril 2011
Messages
9
Best answers
0
J'aime
0
Points
421
#26
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 ?
 
Inscrit
7 Janvier 2010
Messages
58
Best answers
0
J'aime
1
Points
729
#27
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 !
 
Dernière édition:

Bryant

Membre actif
Inscrit
27 Février 2011
Messages
225
Best answers
0
J'aime
0
Points
441
#28
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 ?
 
Inscrit
24 Novembre 2016
Messages
30
Best answers
0
J'aime
1
Points
69
#29
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