Autoit Script AutoIt en cours dans plusieurs bureaux virtuels

Inscrit
15 Avril 2011
Messages
457
Reactions
1
#1
Bonjour, vous le savez tous, un script AutoIt monopolise l'ordinateur lorsqu'il est lancé (surtout avec un MouseMove ou un MouseClick). Je cherche donc une solution qui permettrait de lancer un script AutoIt, et de faire autre chose pendant ce temps. J'ai essayé le logiciel Dexpot qui permet de créer plusieurs bureaux virtuels. Le problème, c'est que lorsque je lance le script sur un bureau et que je vais sur un autre, le script s'arrête :S

Quelqu'un peut-il m'aider ? ^^
 
A

Anonymous

Invité
#2
Tu peux utiliser une VM il me semble (Virtual Machine)
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#3
Je vais me renseigner. Merci ;)


EDIT : Je n'arrive pas à lancer de machine virtuelle, j'ai une erreur au lancement :S Les bureaux virtuelles ne marchent-ils vraiment pas ?
 
Inscrit
5 Decembre 2010
Messages
114
Reactions
0
#4
Il faut que tu utilise Oracle VM VirtualBox pour créer une machine virtuel, tu choisis son OS, la taille de son disque dur.
Il te faudra au préalable posséder soit le CD soit l'iso de l'OS que tu veux mettre sur ta VM. Et lorsque tu va lancer ta machine virtuel tu indique le lecteur CD correspondant a l'OS tu l'installe, tu installes Dofus et tu peux faire tourner ton bot.
Moi je me suis "procuré" Windows Vista et j'ai monté l'iso avec Daemon Tools.
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#5
Ah ouais c'est pour ça que ça ne marchait pas chez moi, je n'avais pas de CD ^^'. Merci beaucoup !
 
Inscrit
19 Juillet 2011
Messages
38
Reactions
0
#6
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()
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...)
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.
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.
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.
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.
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.
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:
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())
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
 
Inscrit
5 Decembre 2010
Messages
114
Reactions
0
#7
Oui c'est bien beau tout cela mais sa n’empêche que si tu utilise cette fonction tu es toujours incapable d'utiliser ton pc a coter du bot puisque qu'il monopolise toujours la souris, d’où la VM.
 
A

Anonymous

Invité
#8
Non justement , elle n'utilise pas la souris. ça simule un click dans la fenêtre sans la souris.

Mais bon , pour le pixelsearch faudra bien que la fenêtre soit en premier plan.
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#9
kangogoo, tu utilises quelle résolution pour ta VM ? Car comme mon PC portable est en 1600x900, j'ai codé mon bot pour un écran 1600x900. Le soucis, c'est qu'avec la VM, il n'apparaît pas dans les réglages, que ce soit sous XP ou sous Vista, c'est du 1600x1200 :S
 
Inscrit
5 Decembre 2010
Messages
114
Reactions
0
#10
Il faudrait que tu recode ton bot avec une résolution plus petit parce que la résolution de ta VM de pourra jamais être égale a celle de ton vrai pc en terme de largeur, mon écran fais aussi 1600x900 et le max de ma VM c'est 1600x780. c'est pour cela que j'ai choisis une résolution de 800x600 plus pratique pour mon bot.
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#11
Mais pourtant la VM, on peut la mettre en plein écran, donc logiquement c'est la même résolution que la machine hôte, non ?
 
Inscrit
5 Decembre 2010
Messages
114
Reactions
0
#12
Non parce que en mettant la VM en pleine écran la barre des taches windows n'est pas prise en compte donc ta VM aura sa barre des taches au dessus de la barre des taches réel. Sinon pour régler la resolution a ta guise tu peux installer les modules complémentaire dans le menu périphérique .
 
A

Anonymous

Invité
#13
Je ne pense pas que PixelSearch monopolise une fenêtre.
 
Inscrit
5 Decembre 2010
Messages
114
Reactions
0
#14
Effectivement mais elle doit être au premier plan pour qu'il détecte le pixel sur la bon fenêtre sinon sa ne marche pas.
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#15
Grâce aux add-ons, la VM se règle automatiquement en 1600x900, logiquement ça devrait marcher, faut que j'essaye, je vous tiens au jus ;)
 
Inscrit
5 Decembre 2010
Messages
114
Reactions
0
#16
NicoMasterChief a dit:
Grâce aux add-ons, la VM se règle automatiquement en 1600x900, logiquement ça devrait marcher, faut que j'essaye, je vous tiens au jus ;)
De quel add-ons parles-tu ? Ça m’intéresse xD
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#17
Bah ce que tu m'as dit : VirtualBox Guest Additions.
 
Inscrit
5 Decembre 2010
Messages
114
Reactions
0
#18
Ah oui, parce que moi j'ai mis en français et c'est écris Modules complémentaires, c'est pour ça, j'ai étais perturbé x)
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#19
Moi aussi c'est en français, mais y a marqué : "Installer les Additions invité...".

Par contre, je sais pas comment échanger des fichiers entre les deux machines :S
 
Inscrit
5 Decembre 2010
Messages
114
Reactions
0
#20
Moi je fais pas mail tout simplement.
 
Haut Bas