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()
Cliquez pour révéler
Cliquez pour masquer
2. On donne une place pour nos argument utiles lors de l'appel de cette fonction. Nous aurons besoin de 5 arguments:
Cliquez pour révéler
Cliquez pour masquer
$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...)
Code 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.
Cliquez pour révéler
Cliquez pour masquer
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.
Cliquez pour révéler
Cliquez pour masquer
If IsHWnD ($HWnD) And WinExists ($Full) <> 0 Then
EndId
Ce qui nous donne :
Code 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.
Cliquez pour révéler
Cliquez pour masquer
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.
Cliquez pour révéler
Cliquez pour masquer
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.
Cliquez pour révéler
Cliquez pour masquer
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:
Cliquez pour révéler
Cliquez pour masquer
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())
Cliquez pour révéler
Cliquez pour masquer
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.
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.
Tutoriel pris de bit-x sur cheat-gam3