Bonjour,
Voici mon petit projet il permet de lancer plusieurs fenêtre de D., pour les multicomptes
Le corps du programme je l'ai récup (je commence avec AutoiIt) , désolé je me souviens plus de qui
Lorsque vous utilisez la config vous enregistrez dans un fichier .ini qui servira à la prochaine connexion
les pros n'hésitez pas à me donner des conseils en programmation sur la façon d'écrire ou de tourner les instructions
Pour les débutants comme moi, vous pouvez me contacter j'explique avec mes mots, parfois ca aide ^^
#RequireAdmin
;~ ----------------------------------------------
#include <Color.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Include <WinAPI.au3>
#include <Process.au3>
#include <Misc.au3>
hotkeyset("{ESC}","Fin")
;~ --------- Déclarations des variables----------
Dim $i
Dim $jouer[2]
Global $Compte[8] ; Les comptes de chaque perso
Global $Fen[8] ; Les fenêtres de chaque perso
Global $FenLance ; La fenêtre de lancement
Global $ndc[8] ; Nom du compte
Global $mdp[8] ; Mot de passe
Global $Perso[8] ; Nom du perso = nom de la fenêtre
Global $EcranX[8] ; position de la fenetre en X
Global $EcranY[8] ; position de la fenetre en Y
Global $TailleX[8] ; Taille de la fenetre en X
Global $TailleY[8] ; Taille de la fenetre en Y
Global $NbDOuverture = 1
Global $Son
Global $Form1
Global $Form0
Global $Coord[2]
;~ -------------------Constantes------------------
Global Const $MonFicIni = @ScriptDir &"\login.ini"
Global Const $NbEcran = "NbEcran"
Global Const $nSon = "Son"
Global Const $Dll = DllOpen("user32.dll")
Global Const $CoulGris = 0x2B251F
Global Const $CoulOrange = 0xFF6100
Global Const $CoulOrangeMdp = 0xFF6500
Global $RecHautX
Global $RecHautY
Global $RecBasX
Global $RecBasY
Local $Groupe1
Local $Bouton1
Local $Bouton2
Local $Bouton11
Local $Bouton12
Local $Bouton13
Local $Bouton14
Local $Label1
Local $Label2
Local $Label3
Local $Label4
Local $Choix1
$Compte[0]="Compte 1"
$Compte[1]="Compte 2"
$Compte[2]="Compte 3"
$Compte[3]="Compte 4"
$Compte[4]="Compte 5"
$Compte[5]="Compte 6"
$Compte[6]="Compte 7"
$Compte[7]="Compte 8"
RecupIni()
opt("CaretCoordMode",1)
;~ -----------------------------------------------
;~ ------------------Le programme-----------------
;~ -----------------------------------------------
; Premier écran
$Form0 = GUICreate("Lancement Dofus", 219, 132, -1, -1)
$Bouton1 = GUICtrlCreateButton("Connexion", 63, 18, 94, 41)
$Bouton2 = GUICtrlCreateButton("Parametrage", 63, 70, 95, 41)
GUISetState(@SW_HIDE,$Form0)
; Deuxième écran
$Form1 = GUICreate("Paramétrage", 188, 245, -1, -1)
$Bt1_1 = GUICtrlCreateButton("Compte 1", 11, 6, 73, 33, $WS_GROUP)
$Bt1_2 = GUICtrlCreateButton("Compte 2", 11, 48, 73, 33, $WS_GROUP)
$Bt1_3 = GUICtrlCreateButton("Compte 3", 11, 91, 73, 33, $WS_GROUP)
$Bt1_4 = GUICtrlCreateButton("Compte 4", 11, 131, 73, 33, $WS_GROUP)
$Bt1_5 = GUICtrlCreateButton("Compte 5", 101, 6, 73, 33, $WS_GROUP)
$Bt1_6 = GUICtrlCreateButton("Compte 6", 101, 48, 73, 33, $WS_GROUP)
$Bt1_7 = GUICtrlCreateButton("Compte 7", 101, 91, 73, 33, $WS_GROUP)
$Bt1_8 = GUICtrlCreateButton("Compte 8", 101, 131, 73, 33, $WS_GROUP)
$Bt1_Ret = GUICtrlCreateButton("Retour", 11, 205, 73, 33, $WS_GROUP)
$Bt1_Son = GUICtrlCreateButton("Son", 101, 205, 73, 33, $WS_GROUP)
$NBCPT = GUICtrlCreateInput($NbDOuverture, 150, 170, 21, 28, BitOR($ES_AUTOHSCROLL,$ES_NUMBER))
GUICtrlSetLimit(-1, 1)
GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
$Label1 = GUICtrlCreateLabel("Nb de compte à ouvrir", 15, 175, 130, 20)
GUICtrlSetFont(-1, 10, 400, 0, "Arial")
GUISetState(@SW_HIDE,$Form1)
GUISetState(@SW_SHOW,$Form0)
While 1
$Msg = GUIGetMsg(1)
Switch $Msg[0]
Case $GUI_EVENT_CLOSE
if $Msg[1]=$Form0 Then
Fini("Arrêt par le bouton fermé")
ElseIf $Msg[1]=$Form1 Then
GUISetState(@SW_HIDE,$Form1)
GUISetState(@SW_SHOW,$Form0)
Endif
Case $Bouton1
GUIDelete($Form0)
LaunchAutologin ()
Fini("Lancement terminé normalement")
Case $Bouton2
GUISetState(@SW_HIDE,$Form0)
GUISetState(@SW_SHOW,$Form1)
while 1
$Msg = GUIGetMsg(1)
Switch $Msg[0]
Case $GUI_EVENT_CLOSE
if $Msg[1]=$Form1 Then Fini("Arrêt par le bouton fermé")
Case $NBCPT
IniWrite($MonFicIni,$NbEcran,$NbEcran,GUICtrlRead($NBCPT))
$NbDOuverture = GUICtrlRead($NBCPT)
Case $Bt1_1
Editconfig (0)
Case $Bt1_2
Editconfig (1)
Case $Bt1_3
Editconfig (2)
Case $Bt1_4
Editconfig (3)
Case $Bt1_5
Editconfig (4)
Case $Bt1_6
Editconfig (5)
Case $Bt1_7
Editconfig (6)
Case $Bt1_8
Editconfig (7)
Case $Bt1_Ret
GUISetState(@SW_HIDE,$Form1)
GUISetState(@SW_SHOW,$Form0)
ExitLoop
EndSwitch
Sleep(50)
WEnd
Case $Bt1_Son
Editsound ()
EndSwitch
Sleep(50)
WEnd
Exit
;~ ----------------------------------------------
;~ -------------------Fonctions------------------
;~ ----------------------------------------------
Func Editsound ()
$son = InputBox ( "le Son", "Son: 1= activé 0=Désactivé", "1")
IniWrite (@ScriptDir & "\login.ini", $nSon , $nSon, $son)
EndFunc
;~ ----------------------------------------------
Func Editconfig ($i)
Local $InCompte
Local $GroupBox1
Local $Label1
Local $Label2
Local $Label3
Local $BtValide
Local $BtAnnule
$InCompte = GUICreate("Compte nCompte", 358, 317, 302, 218)
GUISetFont(10, 400, 0, "MS Sans Serif")
$GroupBox1 = GUICtrlCreateGroup("", 8, 8, 337, 261, -1, $WS_EX_CLIENTEDGE)
GUICtrlCreateLabel("Login", 24, 24, 37, 20)
$Ndc[$i] = GUICtrlCreateInput($Ndc[$i], 139, 24, 185, 24)
GUICtrlCreateLabel("Mot de passe", 19, 66, 86, 20)
$Mdp[$i] = GUICtrlCreateInput($Mdp[$i], 139, 58, 185, 24)
GUICtrlCreateLabel("Nom du perso", 19, 98, 89, 20)
$Perso[$i] = GUICtrlCreateInput($Perso[$i] , 139, 90, 185, 24)
$EcranX[$i] = GUICtrlCreateInput($EcranX[$i], 139, 125, 185, 24, BitOR($ES_AUTOHSCROLL,$ES_NUMBER))
GUICtrlCreateLabel("Fen position X", 19, 133, 89, 20)
$EcranY[$i] = GUICtrlCreateInput($EcranY[$i], 139, 160, 185, 24, BitOR($ES_AUTOHSCROLL,$ES_NUMBER))
GUICtrlCreateLabel("Fen position Y", 19, 168, 89, 20)
$TailleX[$i] = GUICtrlCreateInput($TailleX[$i], 139, 195, 185, 24, BitOR($ES_AUTOHSCROLL,$ES_NUMBER))
GUICtrlCreateLabel("Fen taille X", 19, 203, 89, 20)
$TailleY[$i] = GUICtrlCreateInput($TailleY[$i], 139, 230, 185, 24, BitOR($ES_AUTOHSCROLL,$ES_NUMBER))
GUICtrlCreateLabel("Fen taille Y", 19, 238, 89, 20)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$BtValide = GUICtrlCreateButton("Valider", 64, 279, 75, 25, $WS_GROUP)
$BtAnnule = GUICtrlCreateButton("Annuler", 216, 279, 75, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
GUIDelete($InCompte)
ExitLoop
Case $BtValide
IniWrite($MonFicIni, $Compte[$i] & "" , "Ndc" , GUICtrlRead($Ndc[$i]) & "" ) ; écrit le nom de compte dans le fichier login.ini
IniWrite($MonFicIni, $Compte[$i] & "" , "Mdp" , GUICtrlRead($Mdp[$i]) & "" ) ; écrit le Mot de passe dans fichier login.ini
IniWrite($MonFicIni, $Compte[$i] & "" , "Perso" , GUICtrlRead($Perso[$i]) & "" ) ; écrit le nom du perso dans fichier login.ini
IniWrite($MonFicIni, $Compte[$i] & "" , "EcranX" , GUICtrlRead($EcranX[$i]) & "" ) ; écrit la position en X de la fenêtre
IniWrite($MonFicIni, $Compte[$i] & "" , "EcranY" , GUICtrlRead($EcranY[$i]) & "" ) ; écrit la position en Y de la fenêtre
IniWrite($MonFicIni, $Compte[$i] & "" , "TailleX" , GUICtrlRead($TailleX[$i]) & "" ) ; La taille de la fenête en X
IniWrite($MonFicIni, $Compte[$i] & "" , "TailleY" , GUICtrlRead($TailleY[$i]) & "" ) ; La taille de la fenête en Y
$Ndc[$i] = GUICtrlRead($Ndc[$i])
$Mdp[$i] = GUICtrlRead($Mdp[$i])
$Perso[$i] = GUICtrlRead($Perso[$i])
$EcranX[$i] = GUICtrlRead($EcranX[$i])
$EcranY[$i] = GUICtrlRead($EcranY[$i])
$TailleX[$i] = GUICtrlRead($TailleX[$i])
$TailleY[$i] = GUICtrlRead($TailleY[$i])
GUIDelete($InCompte)
ExitLoop
Case $BtAnnule
GUIDelete($InCompte)
ExitLoop
Exit
EndSwitch
WEnd
EndFunc
;~ ----------------------------------------------
Func LaunchAutologin ()
Local $FenActive
Local $PosF
Local $HautF
Local $HautF1
Local $LargF
Local $LargF1
Local $pixel
Local $Rec1HautX
Local $Rec1HautY
Local $Rec1BasX
Local $Rec1BasY
Local $PosF
local $pixel_1
Local $Tempo
If Not WinExists("Updater Dofus") Then
; Lancement du launcher
$iPID = Run("C:\Program Files\Dofus 2\app\UpLauncher.exe")
If $iPID = 0 Then
Fini("Désolé impossible de lancer Dofus")
EndIf
sleep(2000)
$FenLance = WinWaitActive("Updater Dofus","")
sleep(500)
If not WinActive($FenLance) Then WinWaitActive($FenLance)
WinWaitActive($FenLance)
sleep(500)
Else
Fini("Désolé le launcher est déjà lancé " & @CRLF & "veuillez le fermer avant d'exécuter le programme")
EndIf
; Récupération des coordonnées et taille de la fenêtre en x,y et taille
$PosF = WinGetPos($FenLance)
; coordonnées du rectangle de référence pour la couleur
$RecHautX = ($PosF[2] * 0.819787) + $PosF[0]
$RecHautY = ($PosF[3] * 0.635696) + $PosF[1]
$RecBasX = ($PosF[2] * 0.853356) + $PosF[0]
$RecBasY = ($PosF[3] * 0.677261) + $PosF[1]
; coordonnée du bouton jouer
$LargF1 = ($PosF[2] * 0.9) + $PosF[0]
$HautF1 = ($PosF[3] * 0.625) + $PosF[1]
For $i=0 To $NbDOuverture-1
; Attente de la fenêtre de lancement
while 1
$pixel_1 = PixelSearch($RecHautX,$RecHautY,$RecBasX,$RecBasY,$CoulGris,0,1,$FenLance)
If not @error Then
MouseMove($LargF1,$HautF1,10)
Sleep(100)
MouseClick("left")
ExitLoop(1)
EndIf
MouseMove($RecHautX,$RecHautY,10)
Sleep(20)
WEnd
; Fenêtre du perso
while 1
$Tempo = 0
; 1°) Récup du Handle
Do
$Tempo = WinActive("[ACTIVE]","")
If _IsPressed("1B",$Dll) Then Fini("Touche echap appuyé" & @CRLF & "récup Handle fenêtre perso" )
Sleep(20)
Until $Tempo <> 0
$Fen[$i] = $Tempo
$PosF = WinGetPos($Fen[$i])
; Coordonnées du rectangle de recherche de la couleur orange pres du bas du bouton jouer
$Rec1HautX = $PosF[2] * 0.414728+ $PosF[0]
$Rec1HautY = $PosF[3] * 0.6133333 + $PosF[1]
$Rec1BasX = $PosF[2] * 0.582687 + $PosF[0]
$Rec1BasY = $PosF[3] * 0.625 + $PosF[1]
; 2°) normalement j'ai la bonne fenêtre alors je regarde lorsque prête
If _IsPressed("1B",$Dll) Then Fini("Touche echap appuyé" & @CRLF & "a l'attente fenêtre perso" )
$pixel_1 = PixelSearch($Rec1HautX,$Rec1HautY,$Rec1BasX,$Rec1BasY,$CoulOrange,0,1,$Fen[$i])
if Not @error Then ExitLoop
Sleep(50)
WEnd
WinMove( $Fen[$i], "",$EcranX[$i],$EcranY[$i],$TailleX[$i],$TailleY[$i])
_Login($i)
sleep(500)
; On réactive le lanceur pour fenêtre suivante
If WinExists($FenLance) Then
WinSetState($FenLance,"",@SW_MINIMIZE)
Sleep(500)
WinSetState($FenLance,"",@SW_RESTORE)
sleep(500)
Else
Fini("Lanceur dofus fermé programme abandonné")
EndIf
WinActivate($FenLance)
sleep(500)
Next
; On copie le mot de passe dans le
ClipPut($mdp[0])
; Si on veut pas le son on ferme la fenêtre lancement
;If $son=0 Then
; WinClose($FenLance)
;EndIf
; on minimise la fenêtre de lancement
If WinExists($FenLance) Then
WinSetState($FenLance,"",@SW_MINIMIZE)
EndIf
EndFunc
;~ ----------------------------------------------
Func _Login($i)
Local $Rec1HautX
Local $Rec1HautY
Local $Rec1BasX
Local $Rec1BasY
Local $Rec2HautX
Local $Rec2HautY
Local $Rec2BasX
Local $Rec2BasY
Local $Rec3HautX
Local $Rec3HautY
Local $Rec3BasX
Local $Rec3BasY
local $pixel_1
Local $pixel_2
Local $pixel_3
Local $PosF
If WinExists($Fen[$i]) Then
; Activation de la fenêtre du perso
WinWait($Fen[$i])
WinActivate($Fen[$i])
WinWaitActive($Fen[$i])
sleep(200)
$PosF = WinGetPos($Fen[$i])
; Coordonnées du rectangle de recherche de la couleur orange pres du bas du bouton jouer
$Rec1HautX = $PosF[2] * 0.414728+ $PosF[0]
$Rec1HautY = $PosF[3] * 0.6133333 + $PosF[1]
$Rec1BasX = $PosF[2] * 0.582687 + $PosF[0]
$Rec1BasY = $PosF[3] * 0.625 + $PosF[1]
; Coordonnées du rectangle si réponse à problème
$Rec2HautX = $PosF[2] * 0.414728 + $PosF[0]
$Rec2HautY = $PosF[3] * 0.436055 + $PosF[1]
$Rec2BasX = $PosF[2] * 0.582687 + $PosF[0]
$Rec2BasY = $PosF[3] * 0.574730 + $PosF[1]
;choix du perso a faire
$Rec3HautX = $PosF[2] * 0.454780 + $PosF[0]
$Rec3HautY = $PosF[3] * 0.854938 + $PosF[1]
$Rec3BasX = $PosF[2] * 0.545219 + $PosF[0]
$Rec3BasY = $PosF[3] * 0.882716 + $PosF[1]
; Coordonnées de la zone de saisie du login
$LargF1 = $PosF[2] * 0.486304 + $PosF[0]
$HautF1 = $PosF[3] * 0.391975 + $PosF[1]
sleep(2000)
while 1
$pixel_2 = PixelSearch($Rec2HautX,$Rec2HautY,$Rec2BasX,$Rec2BasY,$CoulOrange,0,1,$Fen[$i])
If not @error Then
; On repond sur OK si problème
MouseMove($pixel_2[0]+10,$pixel_2[1]+5,10)
Sleep(100)
MouseClick("left")
; On positionne le curseur dans la zone de saisie du login
Sleep(1000)
MouseMove($LargF1,$HautF1,10)
Sleep(100)
MouseClick("left")
; Remise à zéro du mot de passe
Sleep(100)
Send("{DEL}")
Sleep(100)
Send("{TAB}")
Sleep(100)
Send("{DEL}")
Sleep(3000)
EndIf
$pixel_1 = PixelSearch($Rec1HautX,$Rec1HautY,$Rec1BasX,$Rec1BasY,$CoulOrange,0,1,$Fen[$i])
if Not @error Then
; On positionne le curseur dans la zone de saisie du login
MouseMove($LargF1,$HautF1,10)
Sleep(100)
MouseClick("left")
Sleep(100)
Send("{DEL}")
; on entre le mot de passe
Send($ndc[$i])
Sleep(100)
Send("{TAB}")
Sleep(100)
Send("{DEL}")
Send($mdp[$i])
Sleep(100)
MouseMove($Rec1HautX+(($Rec1BasX-$Rec1HautX)/2),$Rec1HautY+(($Rec1BasY-$Rec1HautY)/2),10)
sleep(100)
MouseClick("left")
EndIf
; Attente du bouton jouer
$pixel_3 = PixelSearch($Rec3HautX,$Rec3HautY,$Rec3BasX,$Rec3BasY,$CoulOrange,0,1,$Fen[$i])
if Not @error then
MouseMove($Rec3HautX+(($Rec3BasX-$Rec3HautX)/2),$Rec3HautY+(($Rec3BasY-$Rec3HautY)/2),10)
Sleep(100)
MouseClick("left")
Sleep(100)
ExitLoop(1)
EndIf
Sleep(30)
WEnd
Else
MsgBox(0,"Erreur","Fenêtre :"& $i & @CRLF & "inexistante")
EndIf
EndFunc
;~ ----------------------------------------------
Func RecupIni()
; Lecture des données du fichier login.ini
$son=IniRead($MonFicIni,$nSon,$nSon,"0")
$NbDOuverture = IniRead($MonFicIni,$NbEcran,$NbEcran,"1")
For $i=0 To 7
$ndc[$i]=Iniread($MonFicIni,$Compte[$i],"Ndc","0")
$mdp[$i]=IniRead($MonFicIni,$Compte[$i],"Mdp","0")
$Perso[$i]=IniRead($MonFicIni,$Compte[$i],"Perso","0")
$EcranX[$i] = IniRead($MonFicIni,$Compte[$i],"EcranX","0")
$EcranY[$i] = IniRead($MonFicIni,$Compte[$i],"EcranY","0")
$TailleX[$i] = IniRead($MonFicIni,$Compte[$i],"TailleX","1024")
$TailleY[$i] = IniRead($MonFicIni,$Compte[$i],"TailleY","768")
Next
EndFunc
;~ ----------------------------------------------
Func CoordEcran($LaFen,$EnX, $EnY)
Local $tpoint = DllStructCreate("int X;int Y")
DllStructSetData($tpoint, "X", $EnX )
DllStructSetData($tpoint, "Y", $EnY )
_WinAPI_ClientToScreen($LaFen, $tpoint)
$Coord[0] = DllStructGetData($tpoint, "X")
$Coord[1] = DllStructGetData($tpoint, "Y")
EndFunc
;~ ----------------------------------------------
Func Fini($Texte)
SplashTextOn("FINI",$Texte)
Sleep(2000)
SplashOff()
Exit 0
EndFunc
;~ ----------------------------------------------
Func Fin()
SplashTextOn("FINI","Terminé par la touche ESC")
Sleep(2000)
SplashOff()
Exit 0
EndFunc
A+