Page 1 sur 1
WinWait trop lent!
Posté : lun. 06 juil. 2020 15:13
par HNB2018
Bonjour à tous!
Je souhaiterai lancer un exe et cacher sa fenetre.
A noter que la commande shellexecute avec le paramètre @SW_HIDE n'a aucun effet!)
Avec le code suivant (WinSetState) j'y arrive toutefois mais on voit la fenetre une fraction de seconde.
J'ai vu dans l'aide que winwait check toutes les 250 ms, y a til un moyen de diminuer ce temps ou une autre solution pour ne pas "apercevoir" la fenêtre?
Voici mon script
Code : Tout sélectionner
$title="[Class:TForm1]"
$Exist="f"
ShellExecute("monprog.exe","","","open",@SW_HIDE)
While $Exist='f'
WinWait($title,"",0.1)
If WinExists($title)=1 Then
WinSetState($title,"",@SW_HIDE)
$Exist='t'
EndIf
Sleep(1)
WEnd
Et merci d'avance pour l'aide.
Re: WinWait trop lent!
Posté : lun. 06 juil. 2020 17:20
par walkson
Bonjour,
Et comme cela ?
Code : Tout sélectionner
$title="[Class:TForm1]"
ShellExecute("monprog.exe","","","open",@SW_HIDE)
$timer = TimerInit()
Do
$diff = TimerDiff($timer)
WinSetState($title,"",@SW_HIDE)
If $diff > 5000 Then ExitLoop
Until WinExists($title) = 1
avez vous essayé
ShellExecute("monprog.exe","","","",@SW_HIDE)
Re: WinWait trop lent!
Posté : lun. 06 juil. 2020 18:12
par mikell
...ou Run("monprog.exe","", @SW_HIDE)
Re: WinWait trop lent!
Posté : mar. 07 juil. 2020 09:49
par HNB2018
Bonjour Profs!
Merci pour l'intérêt.
et/ou
ne fonctionnent pas!
La fenêtre reste visible.
J'ai également essayé le code avec timer + boucle sans aucun résultat.

Re: WinWait trop lent!
Posté : mar. 07 juil. 2020 10:15
par TommyDDR
Je ne vois pas l'utilité de d'utiliser WinWait si c'est pour attendre 0.1s et le faire en boucle, retirez la ligne winwait et réessayez.
Pourquoi mettre "f" et "t" dans exist ? false et true ne vous conviennent pas ? ^^
Edit : ah bah walkson a proposé la même solution ^^
Re: WinWait trop lent!
Posté : mar. 07 juil. 2020 10:24
par HNB2018
Salut Tommy, tu as raison, la flemme d'écrire les variables en entier peut etre? lol
Je viens de remarquer que lorsque j'ajoute un Sleep(80) juste après le shellexecute la fenêtre devient invisible après ouverture.
On la voit apparaitre très rapidement pour disparaitre après, ce que je souhaitais éviter.
dès que je mets un sleep(70) la fenetre reste visible! Il semble qu'il y un évènement qui échappe à la fonction @sw_hide ?
Merciencore
Re: WinWait trop lent!
Posté : mar. 07 juil. 2020 14:28
par TommyDDR
pourtant vous vous compliquez la vie pour tester les valeurs ^^
Votre flemme d'écrire un caractère se transforme en perte de temps à en écrire 7 de plus dans un if :p
J'ajoute une modification au code de walkson :
Re: WinWait trop lent!
Posté : mer. 08 juil. 2020 09:47
par HNB2018
Salut Tommy,
Merci pour les explications sur les variables.
Pour le code malheureusement la fenêtre reste visible
Edit: J'ai essayé de 'tracer' la boucle pour voir le souci et il me semble que c'est le winsetstate qui ne fonctionne pas!
Code : Tout sélectionner
$title='[Class:TForm1]'
ShellExecute('prog.exe','','','open',@SW_HIDE)
Local $timer = TimerInit()
Local $canExit
Do
ConsoleWrite('entrée ds Do'&@CRLF)
Local $diff = TimerDiff($timer)
ConsoleWrite('test WinExists'&@CRLF)
If WinExists($title)==1 Then
ConsoleWrite('WinExists vrai ... cache le'&@CRLF)
WinSetState($title,"",@SW_HIDE)
$canExit = True
EndIf
ConsoleWrite('test timer 5 seconds atteint'&@CRLF)
If $diff > 5000 Then
ConsoleWrite('5 seconds écoulé'&@CRLF)
ExitLoop
EndIf
Until $canExit
ConsoleWrite('Fin boucle Do'&@CRLF)
Exit
Et voici le résultat de la console
Code : Tout sélectionner
>"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Program Files\Cyber\register.au3"
entrée ds Do
test WinExists
WinExists vrai ... hide it
test timer 5 seconds atteint
Fin boucle Do
>Exit code: 0 Time: 0.6197
Je remarque qu'on rentre bien dans la ligne winsetstate, mais ma fenetre reste visible

Re: WinWait trop lent!
Posté : mer. 08 juil. 2020 10:59
par walkson
Bonjour,
Essayez ce code en mettant votre programme. Si la fenêtre réagit, c'est que le problème vient de $title='[Class:TForm1]'
Code : Tout sélectionner
;Run process
$iPID = Run("Notepad.exe")
;Allow window to initialize...
Sleep (500)
;Get HWND.
$hWnd = _GetHwndFromPID($iPID)
;Maximize
WinSetState($hWnd, "", @SW_MAXIMIZE)
;Wait 2 seconds
Sleep(2000)
;Minimize
WinSetState($hWnd, "", @SW_MINIMIZE)
;Wait 2 seconds
Sleep(2000)
;Restore window
WinSetState($hWnd, "", @SW_SHOWDEFAULT )
Sleep(1000)
WinActivate($hWnd, "" )
Func _GetHwndFromPID($PID)
$hWnd = 0
$winlist = WinList()
Do
For $i = 1 To $winlist[0][0]
If $winlist[$i][0] <> "" Then
$iPID2 = WinGetProcess($winlist[$i][1])
If $iPID2 = $PID Then
$hWnd = $winlist[$i][1]
ExitLoop
EndIf
EndIf
Next
Until $hWnd <> 0
Return $hWnd
EndFunc;==>_GetHwndFromPID
Re: WinWait trop lent!
Posté : mer. 08 juil. 2020 11:12
par HNB2018
Salut Maestro @walkson
Effectivement j'obtiens une erreur :
$hWnd = _GetHwndFromPID($iPID)
$hWnd = ^ ERROR
Edit : heuu bizarre je ne trouve rien dans l'aide sur _GetHwndFromPID
Edit2: vraiment désolé je suis reelement noob dans autoit, je viens de voir qu'il s'agit d'une fonction et après test ma fenetre s'agrandit et il n'y a aucune erreur!
Re: WinWait trop lent!
Posté : mer. 08 juil. 2020 22:51
par TommyDDR
C'est normal, elle n'existe pas, walkson vous l'a pourtant fourni dans son script

Re: WinWait trop lent!
Posté : ven. 10 juil. 2020 16:09
par jguinch
Perso,j 'ai déjà eu ce genre de problème, lié au fait que l'application créé plusieurs fenêtres, certaines étant non visibles.
Peut-être qu'en utilisant WinList("[Class:TForm1]") tu pourras voir si d'autres fenêtres existent ?
Re: WinWait trop lent!
Posté : sam. 11 juil. 2020 11:17
par HNB2018
Bonjour @jguinch
Merci pour cette astuce, voici le résultat ci dessous
Cela signifie t-il qu'il y a d'autres fenêtres?
Merci par avance
Re: WinWait trop lent!
Posté : lun. 13 juil. 2020 14:47
par jguinch
Ca signifie qu'il n'y a qu'une fenêtre