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.

Code : Tout sélectionner

ShellExecute("monprog.exe","","","",@SW_HIDE)
et/ou

Code : Tout sélectionner

Run("monprog.exe","", @SW_HIDE)
ne fonctionnent pas!
La fenêtre reste visible.

J'ai également essayé le code avec timer + boucle sans aucun résultat. :roll:

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 ^^
Local $existBool = true
Local $existTxt = "t"
If($existBool) Then
    ;Blabla
EndIf
If($existTxt == "t") Then
    ;Blabla
EndIf
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 :
Local $title="[Class:TForm1]"
ShellExecute("monprog.exe","","","open",@SW_HIDE)
Local $timer = TimerInit()
Local $canExit

Do
   Local $diff = TimerDiff($timer)
        Local $hwnd = WinExists($title)
        If(IsHwnd($hwnd)) Then
       WinSetState($title,"",@SW_HIDE)
            $canExit = True
        EndIf
   If $diff > 5000 Then ExitLoop
Until $canExit

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

Image

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