[R] Fermeture d'une fenêtre-fille

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
GMH
Niveau 6
Niveau 6
Messages : 227
Enregistré le : dim. 24 juin 2012 14:56
Status : Hors ligne

[R] Fermeture d'une fenêtre-fille

#1

Message par GMH »

Bonjour,

Je ne parviens pas à fermer une fenêtre-fille contenant une boucle infinie, sans que la fenêtre-mère plante. Je souhaiterais sortir de la boucle et fermer la fenêtre-fille par le bouton ECHAP de mon clavier, tout en retrouvant la main sur la fenêtre-mère.

Code : Tout sélectionner

Func fenetreFille()
Local $hDLL = DllOpen("user32.dll")

While 1
	If _IsPressed("1B", $hDLL) then
		ExitLoop
		fermerFenetreFille()
	EndIf
	...
	Ici le code affichant les valeurs contenues dans un fichier texte, une à une avec un temps de pause entre chacun des affichages
	...
WEnd

EndFunc


Func fermerFenetreFille()
	FileClose($hFileOpen)
	GuiDelete($GUIfenetreFille)
EndFunc
Je vous remercie de votre aide.
Modifié en dernier par GMH le mar. 01 mai 2018 10:22, modifié 1 fois.
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: [..] Fermeture d'une fenêtre-fille

#2

Message par walkson »

Bonjour,
à l'appel de la touche Echap, la gui se ferme automatiquement. Il faudra utiliser un autre raccourci comme F2
Un remarque sur votre code
fermerFenetreFille()
ExitLoop
Je pense que c'est mieux ainsi :P
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: [..] Fermeture d'une fenêtre-fille

#3

Message par mikell »

ESC est utilisé par défaut pour fermer la gui, mais rien n'interdit de changer ça, avec HotkeySet par exemple :P

#include <GUIConstantsEx.au3>

HotKeySet("{ESC}", "Tilt")

$gui = GUICreate("test", 400, 100)
GUISetState()

While GUIGetMsg() <> $GUI_EVENT_CLOSE
    Sleep(10)
WEnd

Func Tilt()
    MsgBox(0, "", "tilt")
EndFunc  

Cela dit, même sans hotkeyset ça ne pose pas vraiment de problème ^^

#include <Misc.au3>

Global $gui2

$gui = GUICreate("test", 400, 100)
GUISetState()

fenetreFille()

While 1
  Sleep(10)
WEnd

Func fenetreFille()
   $gui2 = GUICreate("fille", 200, 200, 200, 200)
   GUISetState()

   While 1
   If _IsPressed("1B") then
      fermerFenetreFille()
      ; ExitLoop
   EndIf
   WEnd
EndFunc

Func fermerFenetreFille()
   GuiDelete($gui2)
EndFunc
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
GMH
Niveau 6
Niveau 6
Messages : 227
Enregistré le : dim. 24 juin 2012 14:56
Status : Hors ligne

Re: [..] Fermeture d'une fenêtre-fille

#4

Message par GMH »

Bonjour et merci pour vos réponses.
Toutes ces méthodes de fermeture de la fenêtre-fille fonctionnent bien. Le problème est que, après fermeture, je n'ai plus la main sur la fenêtre-mère. Celle-ci est plantée. Le problème se situe donc dans le code de la fenêtre-mère. Il doit y avoir une boucle qui a été contrariée lors de l'ouverture de la fenêtre-fille. Je vais regarder ça de plus près.
Je vous remercie encore.
==============================================================
J'avais, en effet, une boucle lancée dans la fenêtre-mère d'où je n'étais pas sorti lorsque j'ouvrais la fenêtre-fille. Je m'attelle à trouver une solution.
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [R] Fermeture d'une fenêtre-fille

#5

Message par TommyDDR »

C'est parceque vous restez bloqué dans votre fonction "fenetreFille" à cause de votre while 1.
Il ne faut jamais mettre de boucle infinie dans une fonction, sinon, toute la gestion des évènements est mise en attente.
Et d'une manière plus générale, je vous conseille d'utiliser le mode évènementiel des GUIs -> Opt("GUIOnEventMode", 1)
Cela permettra d'utiliser les fonctions GUISetOnEvent (évènements de fenêtre) et GUICtrlSetOnEvent (évènements de controls) qui permettent d'associer une fonction à un événement précis : quand l’événement arrive, votre fonction est automatiquement lancée (sauf si vous avec bloqué le programme dans une boucle infini)
Dernier conseil, créez toutes vos fenêtre en début de script et affichez / cachez les sur demande au lieu de les recréer / détruire.
#include <GUIConstantsEx.au3>
#include <Misc.au3>

Opt("GUIOnEventMode", 1)

Global $gui
Global $gui2

$gui = GUICreate("test", 400, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, quit, $gui)
GUISetState()

$gui2 = GUICreate("fille", 200, 200, 200, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, fermerFenetreFille, $gui2)
fenetreFille()

While 1
   Sleep(10)
WEnd

Func fenetreFille()
   GUISetState(@SW_SHOW, $gui2)
EndFunc

Func fermerFenetreFille()
    GUISetState(@SW_HIDE, $gui2)
EndFunc

Func quit()
   Exit
EndFunc
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
GMH
Niveau 6
Niveau 6
Messages : 227
Enregistré le : dim. 24 juin 2012 14:56
Status : Hors ligne

Re: [R] Fermeture d'une fenêtre-fille

#6

Message par GMH »

Bonjour et merci pour vos conseils. Quand on apprend, on ne prend pas toujours de bonnes habitudes.
Répondre