WinWait trop lent!

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
HNB2018
Niveau 1
Niveau 1
Messages : 12
Enregistré le : dim. 04 nov. 2018 18:01
Status : Hors ligne

WinWait trop lent!

#1

Message 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.
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: WinWait trop lent!

#2

Message 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)
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: WinWait trop lent!

#3

Message par mikell »

...ou Run("monprog.exe","", @SW_HIDE)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
HNB2018
Niveau 1
Niveau 1
Messages : 12
Enregistré le : dim. 04 nov. 2018 18:01
Status : Hors ligne

Re: WinWait trop lent!

#4

Message 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:
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: WinWait trop lent!

#5

Message 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 ^^
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
HNB2018
Niveau 1
Niveau 1
Messages : 12
Enregistré le : dim. 04 nov. 2018 18:01
Status : Hors ligne

Re: WinWait trop lent!

#6

Message 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
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: WinWait trop lent!

#7

Message 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
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
HNB2018
Niveau 1
Niveau 1
Messages : 12
Enregistré le : dim. 04 nov. 2018 18:01
Status : Hors ligne

Re: WinWait trop lent!

#8

Message 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 :(
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: WinWait trop lent!  

#9

Message 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
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
HNB2018
Niveau 1
Niveau 1
Messages : 12
Enregistré le : dim. 04 nov. 2018 18:01
Status : Hors ligne

Re: WinWait trop lent!

#10

Message 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!
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: WinWait trop lent!

#11

Message par TommyDDR »

C'est normal, elle n'existe pas, walkson vous l'a pourtant fourni dans son script ;)
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: WinWait trop lent!

#12

Message 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 ?
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
HNB2018
Niveau 1
Niveau 1
Messages : 12
Enregistré le : dim. 04 nov. 2018 18:01
Status : Hors ligne

Re: WinWait trop lent!

#13

Message 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
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: WinWait trop lent!

#14

Message par jguinch »

Ca signifie qu'il n'y a qu'une fenêtre
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Répondre