Page 1 sur 1

[..] Fermeture d'une GUI

Posté : mar. 25 oct. 2011 13:31
par XeniOne
Bonjour,

voici mon PB:

Moi et un collègue développons un utilitaire pour éviter les tâches répétitives au boulot.
Je suis actuellement en train d'améliorer le bouton "shutdown" qui m'ouvre une deuxième GUI composé de 3 Boutons (Eteindre PC distant, Fermer session, Reboot Distant), seulement, quand j'ai fais mon choix et que je ferme cette fenêtre, cela ferme tout mon script! Du coup je dois relancer l'utilitaire pour continuer.

Voici le bout de code en question.

Code : Tout sélectionner

        case $msg=$button3
            $rinput = GUICtrlRead ($input1)
Local           $Form2 = GUICreate("Choix du shutdown", 374, 130, 335, 209)
Local           $Label5 = GUICtrlCreateLabel("", 112, 32, 156, 17)
Local           $Buttoneteindre = GUICtrlCreateButton("Eteindre", 30, 15, 100, 30, $WS_GROUP)
Local           $Buttonredemarrer = GUICtrlCreateButton("Reboot", 140, 15, 100, 30, $WS_GROUP)
Local           $Buttonfermersession = GUICtrlCreateButton("LogOff", 250, 15, 100, 30, $WS_GROUP)
                $Input3 = GUICtrlCreateInput("", 0, 60, 374, 70)
                GUISetState(@SW_SHOW)

    While 2 ;Début de boucle
Local    $nMsg = GUIGetMsg() ;Ne pas toucher
    Switch $nMsg  ;Ne pas toucher
        Case $GUI_EVENT_CLOSE ;Pour fermer la Gui, c'est la croix rouge en haut a droite. Fait les actions si elle est enclenchée
            Exit ;Pour quitter le script
        Case $Buttoneteindre ;Si on appui sur le boutton choix 1
            run(@ComSpec & ' /c shutdown -f -s -m \\' &$rinput&' -c '& $Input3, @SystemDir, @SW_HIDE )
            MsgBox( 0, "Extinction du système distant", "Le système distant va s'éteindre") ;Affiche une boite de dialogue
            ;A la place de la MsgBox vous pouvez faire bien d'autes action, un calcul, créer un dossier ... bref les possibilités sont énormes
        Case $Buttonredemarrer ;Si on appui sur le boutton choix 2
            run(@ComSpec & ' /c shutdown -f -r -m \\' &$rinput&' -c '& $Input3, @SystemDir, @SW_HIDE )
            MsgBox( 0, "Redemarrage du système distant", "Le système distant va redemarrer") ;Affiche une boite de dialogue
        Case $Buttonfermersession ;Si on appui sur le boutton choix 3
            run(@ComSpec & ' /c shutdown -f -l -m \\' &$rinput&' -c '& $Input3, @SystemDir, @SW_HIDE )
            MsgBox( 0, "Fermeture de session", "La session distante va se fermer") ;Affiche une boite de dialogue
    EndSwitch
    WEnd ;Fin de boucle
Si vous avez besoin d'autre chose, no probs ;)

Merci, bonne journée.

Re: [..] Fermeture une GUI

Posté : mar. 25 oct. 2011 13:46
par ani
while 2 → while 1
exit → winclose("Choix du shutdown")

doit exister une autre maniere pour fermer cette fenêtre.

Re: [..] Fermeture une GUI

Posté : mar. 25 oct. 2011 14:05
par mikell
Yes, avec (voir l'aide)

Code : Tout sélectionner

$nMsg = GUIGetMsg([color=#FF0000]1[/color])
$nMsg[0] = 0 or Event ID or Control ID   [color=#008000] ; $GUI_EVENT_CLOSE[/color]
$nMsg[1] = The window handle the event is from   [color=#008000] ; WinGetHandle("gui")[/color]

Re: [..] Fermeture d'une GUI

Posté : mar. 25 oct. 2011 15:21
par XeniOne
@mikell: ça ne fonctionne pas...

Code : Tout sélectionner

While 1
Local    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            WinClose("Choix du shutdown")
        Case $Buttoneteindre
            run(@ComSpec & ' /c shutdown -f -s -m \\' &$rinput&' -c '& $Input3, @SystemDir, @SW_HIDE )
            MsgBox( 0, "Extinction du système distant", "Le système distant va s'éteindre")
        Case $Buttonredemarrer
            run(@ComSpec & ' /c shutdown -f -r -m \\' &$rinput&' -c '& $Input3, @SystemDir, @SW_HIDE )
            MsgBox( 0, "Redemarrage du système distant", "Le système distant va redemarrer")
        Case $Buttonfermersession
            run(@ComSpec & ' /c shutdown -f -l -m \\' &$rinput&' -c '& $Input3, @SystemDir, @SW_HIDE )
            MsgBox( 0, "Fermeture de session", "La session distante va se fermer")
    EndSwitch
    WEnd
Plus rien ne se ferme...aucune action

@ani: J'avais cherché dans l'aide mais je comprends pas tout.
L'aide que tu as posté m'a encore plus perdu ^^

Re: [..] Fermeture d'une GUI

Posté : mar. 25 oct. 2011 16:14
par moi

Code : Tout sélectionner

If WinActive("ma fenetre 1") Then
                GUIDelete($fotmmafenetre1)
            ElseIf WinActive("ma fenetre 2l") Then
                GUIDelete($fotmmafenetre2)
EndIf
?

Re: [..] Fermeture d'une GUI

Posté : mar. 25 oct. 2011 17:01
par GaRydelaMer
Bonjour

pourtant il t'a donné la réponse VOIR L'AIDE et GUIGetMsg(1)

Code : Tout sélectionner

Local $aMsg, $CtrlMsgId, $HWnd
While 1
    $aMsg = GUIGetMsg(1)
    $CtrlMsgId = $aMsg[0]
    $HWnd = $aMsg[1]
    Select
        Case $CtrlMsgId = $GUI_EVENT_CLOSE
            If $HWnd = $GUI_1 Then ; si $GUI_1 et la fenêtre principale
                ExitLoop; ici on quitte la boucle
            EndIf
            GUIDelete($HWnd); ici on ferme juste la fenêtre les autres
        Case ; Ici les autres messages ou contrôles à traiter Attention tu peux avoir 2 contrôles qui ont le même ID sur 2 fenêtres différentes
 
    EndSelect
    Sleep(10)
WEnd
 

Re: [..] Fermeture d'une GUI

Posté : mar. 25 oct. 2011 21:59
par mikell
Merci Gary mais pour la compréhension je crois qu'il vaut mieux faire simple :roll:

Code : Tout sélectionner

While 1
$nMsg = GUIGetMsg(1)
Select
    Case $nMsg[0] = $GUI_EVENT_CLOSE
        If $nMsg[1] = $gui_2 Then    [color=#008000]; fenêtre fille[/color]
            GUIDelete($gui_2)       [color=#008000]; on ferme la fenêtre fille[/color]
        Else       [color=#008000]; fenêtre principale[/color]
            Exit    [color=#008000]; on se barre[/color]
        EndIf
EndSelect
Wend

Re: [..] Fermeture d'une GUI

Posté : mer. 26 oct. 2011 09:35
par GaRydelaMer
Merci Mikell mais je vois pas la différence avec ce que j'ai écris, de plus moi au moins je déclare mes variables !!!

De plus avec Ta solution, si tu as 2 fenêtre fille ça marche plus :P

Re: [..] Fermeture d'une GUI

Posté : mer. 26 oct. 2011 13:59
par mikell
Bien sûr que c'est pareil, tu as raison sur tous les points, c'était juste manière de simplifier un max pour faire comprendre plus facilement le principe ^^

Avec 2 fenêtres filles un " ElseIf $nMsg[1] = $gui_3 Then... " ferait pas l'affaire ? :wink:

Re: [..] Fermeture d'une GUI

Posté : mer. 26 oct. 2011 14:04
par GaRydelaMer
Si tu veux !!

ou ca:

Code : Tout sélectionner

Case $nMsg[0] = $GUI_EVENT_CLOSE And $nMsg[1] = $GUI_1
    Exit
Case $nMsg[0] = $GUI_EVENT_CLOSE And $nMsg[1] = $GUI_2
   GUIDelete($GUI_2)
Case $nMsg[0] = $GUI_EVENT_CLOSE And $nMsg[1] = $GUI_3
   GUIDelete($GUI_3)
Mais pour tout te dire je préfère la solution 1, et j'utilise beaucoup plus mode événementiel (que ca d'ailleur).
Et la j'ai une fonction pour l'exit et une autre pour fermer la fenêtre.

Re: [..] Fermeture d'une GUI

Posté : mer. 26 oct. 2011 16:34
par XeniOne
Youpi....marche pas...

Code : Tout sélectionner

; Bouton de SHUTDOWN OK
        case $msg=$button3
            $rinput = GUICtrlRead ($input1)
Local           $Form2 = GUICreate("Choix du shutdown", 374, 130, 335, 209) ;Créer une fenêtre
Local           $Label5 = GUICtrlCreateLabel("", 112, 32, 156, 17) ;Créer un label c'est un texte. remplacer ce qu'il y a entre "" par votre question
Local           $Buttoneteindre = GUICtrlCreateButton("Eteindre", 30, 15, 100, 30, $WS_GROUP) ;Créer un boutton
Local           $Buttonredemarrer = GUICtrlCreateButton("Reboot", 140, 15, 100, 30, $WS_GROUP) ;Créer un boutton
Local           $Buttonfermersession = GUICtrlCreateButton("LogOff", 250, 15, 100, 30, $WS_GROUP) ;Créer un boutton
                $Input3 = GUICtrlCreateInput("", 0, 60, 374, 70)
                GUISetState(@SW_SHOW)


Local $aMsg, $CtrlMsgId, $HWnd
While 1
    $aMsg = GUIGetMsg(1)
    $CtrlMsgId = $aMsg[0]
    $HWnd = $aMsg[1]
    Select
        Case $CtrlMsgId = $GUI_EVENT_CLOSE
            If $HWnd = $Form2 Then ; si $GUI_1 et la fenêtre principale
                ExitLoop; ici on quitte la boucle
            EndIf
            GUIDelete($HWnd); ici on ferme juste la fenêtre les autres
        Case $Buttoneteindre
            run(@ComSpec & ' /c shutdown -f -s -m \\' &$rinput&' -c '& $Input3, @SystemDir, @SW_HIDE )
            MsgBox( 0, "Extinction du système distant", "Le système distant va s'éteindre")
        Case $Buttonredemarrer
            run(@ComSpec & ' /c shutdown -f -r -m \\' &$rinput&' -c '& $Input3, @SystemDir, @SW_HIDE )
            MsgBox( 0, "Redemarrage du système distant", "Le système distant va redemarrer")
        Case $Buttonfermersession
            run(@ComSpec & ' /c shutdown -f -l -m \\' &$rinput&' -c '& $Input3, @SystemDir, @SW_HIDE )
            MsgBox( 0, "Fermeture de session", "La session distante va se fermer")
    EndSelect
    Sleep(10)
    WEnd
Ca m'ouvre direct le bouton éteindre et impossible d'éteindre le script.... --"

Re: [..] Fermeture d'une GUI

Posté : mer. 26 oct. 2011 16:41
par GaRydelaMer
c'est normal, tu as inclus le code dans une autre boucle, remplace ExitLoop par Exit.

Mais le mieux serai d'avoir qu'une While --- Wend

Re: [..] Fermeture d'une GUI

Posté : mer. 26 oct. 2011 22:33
par PandiPanda
sinon à la place du guiGetMsg() y'a toujours l'alternative avec GUICtrlSetOnEvent()
► Afficher le texteExemple ^^

Re: [..] Fermeture d'une GUI

Posté : mer. 02 nov. 2011 13:30
par XeniOne
J'veux faire simple...

ça m'affiche direct le message "MsgBox( 0, "Extinction du système distant", "Le système distant va s'éteindre")"

Qu'est-ce qui cloche?? Je suis pas loin j'en suis sur...
Dès que je modifie un truc c'est ou ça qui se passe ou alors rien ne se passe...

Code : Tout sélectionner

; Bouton de SHUTDOWN OK
        case $msg=$button3
            $rinput = GUICtrlRead ($input1)
Local           $Form2 = GUICreate("Choix du shutdown", 374, 130, 335, 209) ;Créer une fenêtre
Local           $Label5 = GUICtrlCreateLabel("", 112, 32, 156, 17) ;Créer un label c'est un texte. remplacer ce qu'il y a entre "" par votre question
Local           $Buttoneteindre = GUICtrlCreateButton("Eteindre", 30, 15, 100, 30, $WS_GROUP) ;Créer un boutton
Local           $Buttonredemarrer = GUICtrlCreateButton("Reboot", 140, 15, 100, 30, $WS_GROUP) ;Créer un boutton
Local           $Buttonfermersession = GUICtrlCreateButton("LogOff", 250, 15, 100, 30, $WS_GROUP) ;Créer un boutton
                $Input3 = GUICtrlCreateInput("", 0, 60, 374, 70)
                GUISetState(@SW_SHOW)


Local $nMsg, $Buttoneteindre, $Buttonredemarrer, $Buttonfermersession
While 1
$nMsg = GUIGetMsg(1)
Select
    Case $nMsg[0] = $GUI_EVENT_CLOSE
        If $nMsg[1] = $Form2 Then    ; fenêtre fille
            GUIDelete($Form2)       ; on ferme la fenêtre fille
        Else       ; fenêtre principale
            Exit    ; on se barre
        EndIf

        Case $Buttoneteindre
            run(@ComSpec & ' /c shutdown -f -s -m \\' &$rinput&' -c '& $Input3, @SystemDir, @SW_HIDE )
            MsgBox( 0, "Extinction du système distant", "Le système distant va s'éteindre")
        Case $Buttonredemarrer
            run(@ComSpec & ' /c shutdown -f -r -m \\' &$rinput&' -c '& $Input3, @SystemDir, @SW_HIDE )
            MsgBox( 0, "Redemarrage du système distant", "Le système distant va redemarrer")
        Case $Buttonfermersession
            run(@ComSpec & ' /c shutdown -f -l -m \\' &$rinput&' -c '& $Input3, @SystemDir, @SW_HIDE )
            MsgBox( 0, "Fermeture de session", "La session distante va se fermer")
    EndSelect
    Sleep(10)
    WEnd

Re: [..] Fermeture d'une GUI

Posté : mer. 02 nov. 2011 14:12
par mikell
► Afficher le texte

Re: [..] Fermeture d'une GUI

Posté : mer. 02 nov. 2011 14:15
par XeniOne
Merci de ta réponse =)
J'allais répondre justement pour dire que j'avais trouvé ^^ (et c'est tout à fait ce que tu as mis)
J'ai pas totalement compris pourquoi mais bon...au moins ça fonctionne!
Merci encore!

Re: [..] Fermeture d'une GUI

Posté : jeu. 12 sept. 2019 13:06
par littlechiki
Bonjour,
Je up le sujet parce que ça fait quand même 8 ans que le sujet a eu le dernier up et vous demande si vous avez une solution qui serait à la page.
(ça a plus l'air de marcher en 2019)
donc voilà mon code :
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

$gui = GUICreate("Ma GUI",500,500)
$button = GUICtrlCreateButton("Affichage",100,100,130,40)
$gui2 = GUICreate("Ma GUI 2",300,300)
GUISetState(@SW_SHOW,$gui)
While 1
   Switch GUIGetMsg()
      Case $GUI_EVENT_CLOSE
         If $gui Then
            Exit
         Else
            GUISetState(@SW_HIDE,$gui2)
         EndIf
      Case $button
         GUISetState(@SW_SHOW,$gui2)
   EndSwitch
WEnd
Quelqu'un aurait une solution pour moi s'il vous plaît ? Merci d'avance !

Re: [..] Fermeture d'une GUI

Posté : jeu. 12 sept. 2019 17:35
par Tlem
Bonjour. Voilà la solution pour votre cas :

Code : Tout sélectionner

#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

$gui = GUICreate("Ma GUI", 500, 500)
$button = GUICtrlCreateButton("Affichage", 100, 100, 130, 40)
$gui2 = GUICreate("Ma GUI 2", 300, 300, -1, -1, -1, -1, $gui)

GUISetState(@SW_SHOW, $gui)

While 1
	$nMsg = GUIGetMsg(1)

	Select
		Case $nMsg[0] = $GUI_EVENT_CLOSE
			If $nMsg[1] = $gui2 Then
				GUISetState(@SW_hide, $gui2)
			Else
				Exit
			EndIf

		Case $nMsg[0] = $button
			GUISetState(@SW_SHOW, $gui2)
	EndSelect
WEnd
Pour la Gui2, j'ai rajouté le flag 'parent' afin que la fenêtre fille ne soit pas masquée par inadvertance.
Pour le reste cela avait déjà été indiqué (plus ou moins) dans les messages précédent. Il suffisait d'adapter.

Cordialement

Re: [..] Fermeture d'une GUI

Posté : ven. 13 sept. 2019 12:29
par littlechiki
Ah il me suffisait d'un Select alors ! bah merci du coup, j'aurais pas pu trouver ! j'ai testé et ça marche pour mon application, merci !