Alors je viens vers vous car j'ai un problème avec la fonction WinActivate() et que j'ai eu beau chercher un peu partout, pas moyen de trouver une solution valable :/
Je bosse sur un script pour pouvoir connecter tous mes comptes dofus a la bonne taille et au bon endroit pour multicomptes sans m'embeter a tout replacer/dimensionner a chaque fois ^^
Tout semble fonctionner a part l'impossibilité d'activer les fenetres une par une pour connecter mes comptes, Je tourne sous win7 64bits ( je suis pas sur mais il y a peu être un problème avec ca )
PS: J'ai fait ca vite fait étant donné que c'est un de mes tous premiers scripts Autoit
#pragma compile(Icon, C:\Program Files (x86)\AutoIt3\Icons\au3.ico)
Hotkeyset("{F9}","Quit")
Const $Password="************"
Dim $AccountNumber
Dim $Account[4]
Dim $Slot[4]
Dim $XY[4][2]=[[0,0],[800,0],[0,430],[800,430]]
Func Quit()
Exit
EndFunc
Func Connect2()
Local $Cpt
Sleep(4500)
For $Cpt = 1 To $AccountNumber
MsgBox(0,"","Cpt = "&$Cpt&" Slot@ = "&$Slot[$Cpt-1]) ;<==== Pour vérifier les PID qui sont en théorie bons ...
WinActivate($Slot[$Cpt-1]) ;<==== Aucun effet
WinWaitActive($Slot[$Cpt-1]) ;<==== Ducoup Jamais
Send("{ENTER}{TAB}{DEL}")
Sleep(100)
Send(""&$Account[$Cpt-1]&"{TAB}")
Sleep(100)
Send(""&$Password&"{ENTER}")
Sleep(4000)
Send("{ENTER}")
Next
EndFunc
Func Login()
Local $Cpt
$AccountNumber=InputBox("Account number"," (1 to 4)","","",150,150)
For $Cpt = 1 To $AccountNumber
$Account[$Cpt-1]=InputBox("Slot "&$AccountNumber,"Which one would you connect ?","","",150,150)
Next
For $Cpt = 1 To $AccountNumber
$slot[$Cpt-1]=Run("C:\Users\Marvo\AppData\Local\Ankama\Dofus\app\Dofus.exe")
WinWaitActive("Dofus") ;<===== J'ai testé avec WinWait ici, ne marche pas pour une raison inconnue
WinMove("Dofus","",$XY[$Cpt-1][0],$XY[$Cpt-1][1],800,430)
Next
Connect2()
EndFunc
Login()
En espérant que certains sauront !
Bonne journée
Modifié en dernier par Marvo le sam. 31 janv. 2015 13:27, modifié 1 fois.
en général les automates de jeu ne sont pas tolérés, donc je me demande si ton sujet va rester ouvert. Cela dit, ZDS a déjà travaillé sur un projet pour Dofus en AutoIt. Le lien est ici.
EDIT : évite le smiley dans le titre et surtout mets un spoiler pour ton code car ce dernier est un peu long, merci !
J'ai modifié comme tu m'as conseillé, merci, pour le coup des bots j'ai lu les règles oui mais je me disais que vu que je m’arrêtè a la simple connexion, je ne sais pas si ca peut s'assimiler a une aide en jeu
Après ma question est surtout en général au niveau de la fonction WinActivate, ça m’embête de pas pouvoir l'utiliser que ce soit pour ce script ou un autre !
je te suggère de faire plusieurs tests pour voir quels sont les retours de tes fonctions. En l’occurrence, mettre ton WinActivate dans une variable pour voir si pour lui, il y est arrivé ou pas, et cela avec toutes les fonctions, histoire d'avoir quelques indices sur une solution possible.
D'un autre côté, puisqu'il s'agit d'un jeu, il se peut que certaines mesures ont été prises ce qui pourrait rendre la tâche un peu plus complexe.
Et enfin, je pense qu'il serait plus sûr de travailler avec le handle plutôt qu'avec le titre d'une fenêtre.
Se référer à Control Viewer ou WinGetHandle.
Ah ok je vois ! J'ai regardé avec control viewer et les résultats étaient bons mais ils correspondaient au PID mais comme ca ne semble pas marcher pour WinActivate, j'avais beau chercher ^^
J'imagine qu'il n'y a pas de moyen direct de récupérer le handle de la fenêtre directement lors du run ? Parce que je ne peux pas utiliser le WinGetHandle a cause du fait que j'ai 4 fenêtres avec le même nom !
Si je n'en trouve pas je vais devoir convertir le PID j'imagine, merci pour le bout de code
Modifié en dernier par Marvo le sam. 31 janv. 2015 19:44, modifié 1 fois.
$iPid = Run("notepad.exe")
$hWin = _WinWaitPID($iPid)
MsgBox(0, "", "Notepad Handle : " & $hWin)
; #FUNCTION# ====================================================================================================================
; Name ..........: _WinWaitPID
; Description ...: Pauses execution of the script until a window associated with the specifed PID exists
; Syntax ........: _WinWaitPID($iPid[, $iFlagActive = 0[, $iTimeout = 0]])
; Parameters ....: $iPid - Process ID (PID).
; $iFlagActive - [optional] . 0 = (default) Returns as soons as the window appears.
; 1 = Waits for the window to be active.
; $iTimeout - Timeout in seconds if the window does not exist. Default is 0 (no timeout).
; Return values .: Success = a handle to the window.
; Failure = 0 if timeout occured
; Author ........: jguinch
; ===============================================================================================================================
Func _WinWaitPID($iProcessID, $iFlagActive = 0, $iTimeout = 0)
Local $hTimer = TimerInit()
$iTimeout = $iTimeout * 1000
While 1
If $iTimeout AND TimerDiff($hTimer) >= $iTimeout Then Return 0
Local $aWinList = WinList()
For $i = 1 To $aWinList[0][0]
If $aWinList[$i][0] <> "" And BitAND(WinGetState($aWinList[$i][1]), 2) Then
If WinGetProcess($aWinList[$i][1]) = $iProcessID Then
If $iFlagActive Then
If WinActive($aWinList[$i][1]) Then Return $aWinList[$i][1]
Else
Return $aWinList[$i][1]
EndIf
EndIf
EndIf
Next
Sleep(10)
WEnd
EndFunc ; ===> _WinWaitPID
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
en plus de la fonction de jguinch, il pourrait aussi être envisageable de changer le titre des fenêtres avec WinSetTitle, au fur et à mesure que ces dernières apparaissent.
Ah oui c'est pas bête de WinSetTitle juste après le run ! Ça parait moins lourd que la fonction de jguinch vu que je peux juste utiliser WinActive derrière ^^ Je vais essayer ça je vous tiens au courant
Me voilà revenu avec une nouvelle version du code !
J'ai étudié un peu vos solutions et j'ai choisi de WinWait la fenêtre "Dofus" juste après son run pour récupérer le handle, et d'ensuite la WinSetTitle pour la différencier des fenêtres a venir (a savoir que ça marche avec 4 mais il est possible qu'avec plus ça plante car les fenêtre se remettent a s’appeler "Dofus" quand on est arrivé a l'écran de connexion, mais bon)
Du coup j'arrive bien a activer chaque fenêtre un peu comme je veux pour rentrer les logs, même si j'ai maintenant un bug étrange ^^ Quand je connecte entre 2 et 4 comptes, le dernier ne fait aucun des Send de connexion ... J'ai rajouté WinClose pour tester, et il le fait bien partout du coup il active bien chaque fenêtre même la dernière, elle refuse juste les send ! (pour un seul compte ca marche très bien sinon ...)
#cs ----------------------------------------------------------------------------
AutoIt Version : 3.3.12.0
Auteur: Marvo
Fonction du Script :
Modèle de Script AutoIt.
#ce ----------------------------------------------------------------------------
; Début du script - Ajouter votre code ci-dessous.
#pragma compile(Icon, C:\Program Files (x86)\AutoIt3\Icons\au3.ico)
Hotkeyset("{F9}","Quit")
Const $Password="***********"
Dim $AccountNumber
Dim $Account[4]
Dim $Slot[4]
Dim $XY[4][2]=[[0,0],[960,0],[0,520],[960,520]]
Func Quit()
Exit
EndFunc
Func Connect()
Local $Cpt
Sleep(4500)
For $Cpt = 1 To $AccountNumber
WinActivate($Slot[$Cpt-1])
WinWaitActive($Slot[$Cpt-1])
Send("{ENTER}")
Sleep(100)
Send("{TAB}")
Sleep(100)
Send("{DEL}")
sleep(100)
Send($Account[$Cpt-1])
Sleep(100)
Send("{TAB}")
Sleep(100)
Send($Password)
Sleep(100)
Send("{ENTER}")
sleep(2000)
winclose("[LAST]")
Next
EndFunc
Func Login()
Local $Cpt
$AccountNumber=InputBox("Account number"," (1 to 4)","","",150,150)
For $Cpt = 1 To $AccountNumber
$Account[$Cpt-1]=InputBox("Slot "&$Cpt,"Which one would you connect ?","","",150,150)
Next
For $Cpt = 1 To $AccountNumber
Run("C:\Users\Marvo\AppData\Local\Ankama\Dofus\app\Dofus.exe")
$slot[$Cpt-1]=WinWait("Dofus")
WinActivate($Slot[$Cpt-1])
WinSetTitle($Slot[$Cpt-1],"","Slot "&$Cpt)
WinMove("[ACTIVE]","",$XY[$Cpt-1][0],$XY[$Cpt-1][1],960,520)
Next
Connect()
EndFunc
Login()
J'ai pas mal utilisé le naio, et tu as des fonctionnalités que tu pourrais réutilisé. De mémoire, il est possible d'attribué des raccourci aux différents comptes (lesquels ont leurs fenêtres renommées), pour switcher de l'un à l'autre (comme ce que tu sembles vouloir faire avec ton WinActivate). Je te conseils de te pencher sur le code du naio (libre), cela devrait t'apporter plusieurs réponses.
Concernant la limite bot/non bot, Ankama (éditeur de Dofus) accepte toute forme d'automatisation qui s'effectue hors du jeu (le naio qui est autorisé par Ankama). Il est par conséquent considéré comme bot un programme qui irait plus loin que l'authentification et la manipulation de fenêtres (par exemple choisir un personnage sur le compte, lancer un sort, fabriquer un objet ...). La connexion automatique ou une aide pour sélectionner la bonne fenêtre via un raccourci est "hors du jeu" et donc autorisé (cela n'aide finalement en rien le joueur à mieux jouer/tricher).
Pour ton dernier problème, regarde dans la naio quelles vérifications sont faites avant le send du log/mdp (du genre winwaitactive ou autre).
Il faut utiliser les fonctions ControlXXX au lieu de Send qui sera bancal comme pas possible.
Et au lieu des titres de fenêtres, ce serait plus judicieux de passer par le handle.
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !