(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()
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...)
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.
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.
Ce qui nous donne :
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.
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.
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.
8. Votre fonction doit ressembler à cela:
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())
10. Et voila !
Vous pouvez maintenant effectuer un click dans une fenêtre ciblé de la manière suivante.
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.
Un petit merci ne coûte rien ! ;)
A bientôt pour de nouvelles aventures !!
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.
Un petit merci ne coûte rien ! ;)
A bientôt pour de nouvelles aventures !!
Last edited: