Femeture script et selection fenêtre

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
liosemi
Niveau 1
Niveau 1
Messages : 3
Enregistré le : sam. 04 juil. 2020 00:12
Status : Hors ligne

Femeture script et selection fenêtre

#1

Message par liosemi »

bonsoir, j'ai eu le besoin d'un outil, je suis en train de le développé, j'ai déjà utilisé autoit par le passé mais c'est ma première application graphique, alors voila j'ai 2 problèmes le premier : impossible de fermer l'application avec la croix rouge (en haut à droite) celle-ci na aucun effet je suis obligé de la fermer depuis la barre des tâches clic droit > exit et je n'ai pas envie de dédier une touche,quel est le problème ?
le deuxième problème est que les touche que j'ai bind son active en permanence, exemple : la touche espace à une fonction dans l'application mais si celle-ci est exécuté mais qu'elle n'est pas sélectionnée (je suis sur une autre fenêtre) la commande sera quand même envoyée au script et non a la fenêtre utilisée, que faire ?

le script est conçu pour compter des répétitions on entre le temps (5sec ici) et le nombres de répétitions (10 ici) quand on appui sur la barre d'espace le temps secoule jusqu'a faire un son et a comptabiliser les répétitions.

voila mon code(a noté que le programme est fonctionnel malgré ces deux soucis mais que les boutons et les input ne servent pas pour le moment et que c'est en développement d'ou certaine chose non utiles,en trop ou qui me servent pur le moment et qui seront suprimées une foit le développement terminé)
merci d'avance pour vos réponses
#include <GUIConstantsEx.au3>
#include <Date.au3>
#include <Sound.au3>
#include <Misc.au3>
#include <StaticConstants.au3>

$reps=0
$repsr=0
$timer=0
$time=0
$junk=1

GUICreate("Reps", 600, 400)
GUICtrlCreateInput ("0",500,360 ,40,20)
GUICtrlCreateLabel ("Reps :",460,363 ,40,20)
GUICtrlCreateInput ("30",500,330,40,20)
GUICtrlCreateLabel ("Temps en secondes :",390,330 ,110,20)
GUICtrlCreateLabel($timer, 250, 80, 110, 80,$SS_CENTER)
GUICtrlSetFont (-1,50,700)
GUICtrlCreateLabel($repsr, 250, 180, 110, 80,$SS_CENTER)
GUICtrlSetFont (-1,50,700)
GUICtrlCreateButton("START", 50, 330, 85, 25)
GUICtrlCreateButton("RESET", 150, 330, 85, 25)


;role du imput
$time=5
$reps=10

$timer=$time


HotKeySet ("{SPACE}", start)
HotKeySet ("r",reset)
HotKeySet ("a",aa)


Func start ()
   if $timer>0 Then
     Do
       Sleep (1000)
       $timer-=1
       GUICtrlCreateLabel($timer, 250, 80, 110, 80,$SS_CENTER)
       GUICtrlSetFont (-1,50,700)
     until $timer=0
     EndIf
   if $timer=0 Then
     $repsr=$repsr+$reps
     $timer=$time
     GUICtrlCreateLabel($timer, 250, 80, 110, 80,$SS_CENTER)
     GUICtrlSetFont (-1,50,700)
     GUICtrlCreateLabel($repsr, 250, 180, 110, 80,$SS_CENTER)
     GUICtrlSetFont (-1,50,700)
     beep (800,200)
   EndIf
EndFunc

Func reset ()
$reps=0
$repsr=0
$timer=0
$time=0

GUICtrlCreateLabel($timer, 250, 80, 110, 80,$SS_CENTER)
GUICtrlSetFont (-1,50,700)
GUICtrlCreateLabel($repsr, 250, 180, 110, 80,$SS_CENTER)
GUICtrlSetFont (-1,50,700)
   EndFunc



Func aa ()
   $repsr += 10
   GUICtrlCreateLabel($repsr, 250, 180, 110, 80,$SS_CENTER)
GUICtrlSetFont (-1,50,700)
EndFunc







GUISetState(@SW_SHOW)
Sleep(100000000)

Avatar du membre
someonescripting
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mar. 16 juin 2020 03:55
Status : Hors ligne

Re: Femeture script et selection fenaitre

#2

Message par someonescripting »

Salut @liosemi,

Plusieurs choses ne vont pas.
- Plutôt que d'utiliser un sleep, utilise plutôt une boucle infini avec While et Wend

- Ensuite en début de script mettre Opt ("GUIOnEventMode", 1) ce qui permet de passer en mode événementiel. Ça te permettra d'associer des événement à des fonctions.

- En début de srcipt mettre Opt("MustDeclareVars", 1), cela t'oblige a déclarer tes variables (permet d’éviter des erreurs), une variable dans le script est Global et si tu créer une nouvelle variable dans une fonction celle ci est "Local" et ne pourra pas être appelé en dehors de sa fonction. (Et pour la lisibilité c'est bien aussi, ca te permet en lisant le script de voir si tu créer une variable, ou si tu l'appelle)

- Ensuite, les contrôles dans ta GUI devraient être dans des variables, cela te permettra de les manipuler dans tes fonctions plutôt que d'en créer d'autre par dessus. (Voir ta fonction "start" ou je t'ai fait l'exemple)

- Si j'ai bien compris, le hotkey "écoute" ton clavier et je te déconseille de passer par la car si tu appuie sur "espace" dans une autre fenêtre que ton script (Chrome par exemple), la touche sera "capturé" par ton script et ne sera pas "entendu" par chrome. (Apres ça je maitrise pas ..., à verifier)

-Et dernier point, tu déclare des variables à 0, pour les modifier tout de suite après la création de la GUI. Je l'ai ai donc directement modifier au départ, et remplacer les données de tes label $LabelTimer et $LabelRepsr

Voila ton script légèrement modifier qui te permettra j’espère de comprendre. (Je débute aussi, il y a surement moyen de faire mieux)

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <Date.au3>
#include <Sound.au3>
#include <Misc.au3>
#include <StaticConstants.au3>

Opt("MustDeclareVars", 1) ;Les variables doivent être déclarés.
Opt("GUIOnEventMode", 1) ;Active le mode événementiel.

;---------- Variables ----------
Global $reps=10
Global $repsr=0
Global $time=5
Global $timer=$time
Global $junk=1
Global $StopScript = False

;---------- GUI ----------
Global $MaGUI = GUICreate("Reps", 600, 400)
Global $Input1 = GUICtrlCreateInput ("0",500,360 ,40,20)
Global $Label1 = GUICtrlCreateLabel ("Reps :",460,363 ,40,20)
Global $Input2 = GUICtrlCreateInput ("30",500,330,40,20)
Global $Label2 = GUICtrlCreateLabel ("Temps en secondes :",390,330 ,110,20)
Global $LabelTimer = GUICtrlCreateLabel("0", 250, 80, 110, 80,$SS_CENTER)
GUICtrlSetFont (-1,50,700)
Global $LabelRepsr = GUICtrlCreateLabel("0", 250, 180, 110, 80,$SS_CENTER)
GUICtrlSetFont (-1,50,700)
Global $ButtonStart = GUICtrlCreateButton("START", 50, 330, 85, 25)
Global $ButtonReset = GUICtrlCreateButton("RESET", 150, 330, 85, 25)
GUISetState(@SW_SHOW) ;C'est mieux de le mettre ici


;---------- Association des événements ----------
GUISetOnEvent ($GUI_EVENT_CLOSE, "CLOSE") ;Si clic sur la croix, lance la fonction "CLOSE"
GUICtrlSetOnEvent ($ButtonReset, "reset") ;Si clic sur le bouton "RESET" lance la fonction "reset"
GUICtrlSetOnEvent ($ButtonStart, "start") ;Si clic sur le bouton "START" Lance la fonction "start"

HotKeySet ("{SPACE}", start)
HotKeySet ("r",reset)
HotKeySet ("a",aa)

;---------- Boucle infini ----------
While Not $StopScript ;boucle tant que $StopScript n'est pas vrai
	Sleep (100)
WEnd

;---------- Fonctions ----------
Func start ()
	if $timer>0 Then
		Do
			Sleep (1000)
			$timer-=1
			GUICtrlSetData ($LabelTimer, $timer)
			;GUICtrlCreateLabel($timer, 250, 80, 110, 80,$SS_CENTER) 		PLUTOT QUE DE CREER UN NOUVEAU LABEL PAR DESSUS L'ANCIEN, MODIFIE CELUI EXISTANT AVEC GUICtrlSetData.
			;GUICtrlSetFont (-1,50,700) 									PLUS NECESSAIRE
		until $timer=0
    EndIf

    if $timer=0 Then
		$repsr=$repsr+$reps
		$timer=$time
		GUICtrlSetData ($LabelTimer, $timer)
		GUICtrlSetData ($LabelRepsr, $repsr)
		;GUICtrlCreateLabel($timer, 250, 80, 110, 80,$SS_CENTER)			IDEM QU'AU DESSUS
		;GUICtrlSetFont (-1,50,700)
		;GUICtrlCreateLabel($repsr, 250, 180, 110, 80,$SS_CENTER)
		;GUICtrlSetFont (-1,50,700)
		beep (800,200)
	EndIf
EndFunc

Func reset ()
	$reps=0
	$repsr=0
	$timer=0
	$time=0

	GUICtrlCreateLabel($timer, 250, 80, 110, 80,$SS_CENTER)
	GUICtrlSetFont (-1,50,700)
	GUICtrlCreateLabel($repsr, 250, 180, 110, 80,$SS_CENTER)
	GUICtrlSetFont (-1,50,700)
EndFunc

Func aa ()
	$repsr += 10
	GUICtrlCreateLabel($repsr, 250, 180, 110, 80,$SS_CENTER)
	GUICtrlSetFont (-1,50,700)
EndFunc

Func CLOSE()
	$StopScript = True ;$StopScript devient vrai, donc quittera la boucle et donc le script
EndFunc

;Sleep(100000000) N'est plus nécéssaire grace à la boucle.

Ne te reste plus qu'a répéter l'exemple de ta fonction "start" dans "reset" et "aa".
Modifié en dernier par someonescripting le lun. 06 juil. 2020 13:37, modifié 1 fois.
Un bon informaticien, est un informaticien fainéant !

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 825
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Femeture script et selection fenaitre

#3

Message par walkson »

Bonjour,
@someonescripting
- Plutôt que d'utiliser un sleep, utilise plutôt une boucle infini avec While et Wend
Cela n'a rien à voir ! le code se bloque pendant près de 28 h puis se ferme...
@liosemi
D'abord une réflexion sur l'orthographe, pouvez vous nous traduire
que les touche que j'ai bind son active en permanence
En suite sur le code que vous dites fonctionnel, ce code n'est pas fonctionnel, il est illogique et absurde
Il suffit de voir le nombre de fois que vous écrivez GUICtrlCreateLabel($timer, 250, 80, 110, 80,$SS_CENTER) et donc les labels se cumulent les uns sur les autres et je ne parle pas du Sleep(100000000)
Le forum est là pour vous aider mais il convient d'avoir des connaissances de base. L'aide d'Autoit est remarquable, détaillé avec des exemples. Vous avez aussi l'outil Koda pour faire une GUI.
Il y a un minimum que nous ne pouvons pas faire, à vous de le travailler. Après, si problème il y a, nous pouvons vous aider !
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)

Avatar du membre
someonescripting
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mar. 16 juin 2020 03:55
Status : Hors ligne

Re: Femeture script et selection fenaitre

#4

Message par someonescripting »

Bonjour @walkson,

Certes, mais il me semblait cela plus "logique". Car même si le script est bloqué 28H, avec la boucle il est bloqué tant qu'on ne ferme pas la fenêtre, ais-je tort ?
Un bon informaticien, est un informaticien fainéant !

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 825
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Femeture script et selection fenaitre

#5

Message par walkson »

Avec un Sleep() le code est à l'arret et ne répond à rien
Avec While, la boucle maintient le code en vie et donc la GUI. Il répond au message envoyé soit par GUICtrlSetOnEvent() en mode événementiel, soit par GUIGetMsg(). On peut fermer le code par un simple Exit et on peut détruire la GUI et maintenir le code en vie tant que la boucle tourne
Exemple
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
Global $Form1
HotKeySet("!x", "exemple") ;alt + x créer la gui
HotKeySet("{Esc}", "_exit")

exemple()

While 1
 Sleep(100) ;temporise le CPU
 ToolTip(">>>>>>>> " & @SEC, 100,200);pour vérifier que le code tourne
WEnd
Func exemple()
If Not IsHWnd($Form1) Then ;empêche de créer 2 Guis
$Form1 = GUICreate("Form1", 409, 182)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
$Button1 = GUICtrlCreateButton("détruit la GUI", 104, 80, 105, 49)
GUICtrlSetOnEvent(-1, "Button1Click")
GUISetState(@SW_SHOW)
EndIf
EndFunc
Func Button1Click()
GUIDelete($Form1)
EndFunc
Func Form1Close()
GUIDelete($Form1)
EndFunc
Func _exit()
   Exit
EndFunc
 
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)

liosemi
Niveau 1
Niveau 1
Messages : 3
Enregistré le : sam. 04 juil. 2020 00:12
Status : Hors ligne

Re: Femeture script et selection fenêtre

#6

Message par liosemi »

bonjour, merci de vos réponses,
comme je l'ai dit j'ai déjà conçu des script avec autoit mais jamais de gui, je tatone.
j' n'ai pas trouver d'autres moyen d'actualiser les labels que de les faire a nouveau.
par "les touche que j'ai bind son active en permanence" je veut dire que les touches assignées a des actions sont active en dehors de l'application et sont capturer par le script meme si je suis sur une autre fenêtre.

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 825
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Femeture script et selection fenêtre

#7

Message par walkson »

Bonjour,
j' n'ai pas trouver d'autres moyen d'actualiser les labels que de les faire a nouveau.
Exécuter un code n'est jamais anodin et vous pouvez rapidement saturer le CPU et la mémoire en faisant n'importe quoi !
Pour modifier la valeur d'un control (label, buton, input, édit...) vous devez utiliser GUICtrlSetData()
Voir l'exemple

Code : Tout sélectionner

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

Global $Form1 = GUICreate("", 318, 205)
Global $Label1 = GUICtrlCreateLabel("", 92, 16, 132, 33)
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUICtrlSetFont(-1,16)
Global $Button1 = GUICtrlCreateButton("Button1", 102, 160, 113, 33)
Global $Label2 = GUICtrlCreateLabel("", 92, 88, 132, 33)
GUICtrlSetBkColor(-1, 0xFFFBF0)
GUISetState(@SW_SHOW)


While 1
 $nMsg = GUIGetMsg()
 Switch $nMsg
  Case $GUI_EVENT_CLOSE
   Exit

	 Case $Button1
		 GUICtrlSetData($Label1,"valeur 1")
		 GUICtrlSetData($Label2,"valeur 2")
 EndSwitch
WEnd
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)

liosemi
Niveau 1
Niveau 1
Messages : 3
Enregistré le : sam. 04 juil. 2020 00:12
Status : Hors ligne

Re: Femeture script et selection fenêtre

#8

Message par liosemi »

merci pour l'aide

Répondre