Aide et conseils concernant AutoIt et ses outils.
littlechiki
Niveau 3
Messages : 48 Enregistré le : sam. 13 avr. 2019 13:58
Status :
Hors ligne
#1
Message
par littlechiki » ven. 13 sept. 2019 12:57
Bonjour,
Je nécessiterai un peu de votre aide concernant les accelerators. voilà déjà mon code et je vous expose mon problème après :
#include <WindowsConstants.au3> #include <GUIConstantsEx.au3> $gui = GUICreate ( "Ma GUI" , 500 , 500 ) $button = GUICtrlCreateButton ( "Affichage" , 100 , 100 , 130 , 40 ) $label = GUICtrlCreateLabel ( "i = 0" , 100 , 150 , 130 , 20 ) $i = 0 GUISetState ( @SW_SHOW , $gui ) Local $aAccelKey [ 1 ] [ 2 ] = [ [ "{ENTER} " , $button ] ] GUISetAccelerators
( $aAccelKey ) While 1 Switch GUIGetMsg ( ) Case $GUI_EVENT_CLOSE Exit Case $button $i += 1 GUICtrlSetData ( $label , "i = " & $i ) EndSwitch WEnd
Mon problème est que les accelerators répètent l'action tant que la touche est enfoncée. si j'appuie sur le bouton avec la souris, i n'augmente que de 1 mais si j'appuie sur entrer, l'action se répète à toute vitesse. Y aurait-il un moyen de faire que l'action ne s'effectue qu'une seule fois tant que ma touche est appuyée ? Je ne peut pas utiliser de HotkeySet parce que mes touches seront utilisé sur d'autres fenêtres aussi. Merci pour vos réponses !
Tlem
Site Admin
Messages : 11773 Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status :
Hors ligne
#2
Message
par Tlem » ven. 13 sept. 2019 18:06
Bonjour.
J'ai pas vraiment eu le temps de regarder en détail, mais est-ce qu'une petite pause après le GUICtrlSetData() n'améliorerais pas un peu ?
walkson
Modérateur
Messages : 1020 Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status :
Hors ligne
#3
Message
par walkson » ven. 13 sept. 2019 19:36
Bonjour,
C'est pas terrible mais ce peut être une piste...........
#include <WindowsConstants.au3> #include <GUIConstantsEx.au3> #include <Misc.au3> $gui = GUICreate ( "Ma GUI" , 500 , 500 ) $button = GUICtrlCreateButton ( "Affichage" , 100 , 100 , 130 , 40 ) Global $label = GUICtrlCreateLabel ( "i = 0" , 100 , 150 , 130 , 20 ) Global $i = 0 , $rep GUISetState ( @SW_SHOW , $gui ) Local $aAccelKey [ 1 ] [ 2 ] = [ [ "{ENTER} " , $button ] ] GUISetAccelerators
( $aAccelKey ) While 1 Switch GUIGetMsg ( ) Case $GUI_EVENT_CLOSE Exit Case $button Do $rep = _IsPressed ( "0D" ) Until $rep = False $i += 1 GUICtrlSetData ( $label , "i = " & $i ) EndSwitch WEnd
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
littlechiki
Niveau 3
Messages : 48 Enregistré le : sam. 13 avr. 2019 13:58
Status :
Hors ligne
#4
Message
par littlechiki » sam. 14 sept. 2019 12:04
Bon de mon côté, j'ai trouvé ça. bon ça marche pas vraiment mais ça c'est parce que j'ai vraiment du mal avec les timers...
#include <WindowsConstants.au3> #include <GUIConstantsEx.au3> #include <Misc.au3> $gui = GUICreate ( "Ma GUI" , 500 , 500 ) $button = GUICtrlCreateButton ( "Affichage" , 100 , 100 , 130 , 40 ) $check = GUICtrlCreateCheckbox ( "" , 1000 , 1000 ) Global $label = GUICtrlCreateLabel ( "i = 0" , 100 , 150 , 130 , 20 ) Global $i = 0 GUISetState ( @SW_SHOW , $gui ) Local $aAccelKey [ 1 ] [ 2 ] = [ [ "{ENTER} " , $button ] ] GUISetAccelerators
( $aAccelKey ) While 1 Switch GUIGetMsg ( ) Case $GUI_EVENT_CLOSE Exit Case $button Local $timer = 0 $timer = TimerInit If Not _IsChecked
( $check ) Then $i += 1 GUICtrlSetData ( $label , "i = " & $i ) EndIf GUICtrlSetState ( $check , $GUI_CHECKED ) If TimerDiff ( $timer ) = 1000 Then GUICtrlSetState ( $check , $GUI_UNCHECKED ) EndSwitch WEnd Func _IsChecked
( $control ) Return BitAND ( GUICtrlRead ( $control ) , $GUI_CHECKED ) = $GUI_CHECKED EndFunc
Vous auriez des idées pour faire qu'il marche ? Mon idée serait de remettre le timer à 0 à chaque fois que le bouton est appuyé, comme ça, tant que le bouton n'est pas relâché au moins une seconde, ça ne fait rien.
walkson
Modérateur
Messages : 1020 Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status :
Hors ligne
#5
Message
par walkson » sam. 14 sept. 2019 15:09
Bonjour,
J'ai essayé plusieurs choses comme des boucles mais le bourrin continue à incrémenter $i par derrière donc la seule chose que j'ai trouvé, c'est de bloqué GUISetAccelerators() un moment et de le remettre comme ceci (J'ai mis la touche F2 car ENTER peut être trompeur)
#include <WindowsConstants.au3> #include <GUIConstantsEx.au3> $gui = GUICreate ( "Ma GUI" , 500 , 500 ) $button = GUICtrlCreateButton ( "Affichage" , 100 , 100 , 130 , 40 ) Global $label = GUICtrlCreateLabel ( "i = 0" , 100 , 150 , 130 , 20 ) Global $i = 0 GUISetState ( @SW_SHOW , $gui ) Local $aAccelKey [ 1 ] [ 2 ] = [ [ "{F2} " , $button ] ] GUISetAccelerators
( $aAccelKey ) While 1 $nmsg = GUIGetMsg ( ) Switch $nmsg Case $GUI_EVENT_CLOSE Exit Case $button $i += 1 GUICtrlSetData ( $label , $i ) $aAccelKey [ 0 ] [ 1 ] = 0 GUISetAccelerators
( $aAccelKey ) Sleep ( 1000 ) $aAccelKey [ 0 ] [ 1 ] = $button GUISetAccelerators
( $aAccelKey ) EndSwitch WEnd
$i continue à être incrémenté mais beaucoup plus lentement
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
littlechiki
Niveau 3
Messages : 48 Enregistré le : sam. 13 avr. 2019 13:58
Status :
Hors ligne
#6
Message
par littlechiki » sam. 14 sept. 2019 15:28
En effet c'est déjà beaucoup mieux Et du coup avec un timer pour dire If $timer <=1000 Then $aAccelKey[0][1] = 0
, ce serait pas possible ? (J'essaye juste de rendre mon programme le plus rapide possible donc l'utilisation de sleep ralentis le tout quoi) Mais c'est une très bonne idée ! Merci déjà !
walkson
Modérateur
Messages : 1020 Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status :
Hors ligne
#7
Message
par walkson » sam. 14 sept. 2019 16:10
Comme ceci ?
(ne pas oubliez F2
)
#include <WindowsConstants.au3> #include <GUIConstantsEx.au3> $gui = GUICreate ( "Ma GUI" , 500 , 500 ) $button = GUICtrlCreateButton ( "Affichage" , 100 , 100 , 130 , 40 ) Global $label = GUICtrlCreateLabel ( "i = 0" , 100 , 150 , 130 , 20 ) Global $i = 0 , $ret GUISetState ( @SW_SHOW , $gui ) Local $aAccelKey [ 1 ] [ 2 ] = [ [ "{F2} " , $button ] ] GUISetAccelerators
( $aAccelKey ) $tt = TimerInit ( ) While 1 $nmsg = GUIGetMsg ( ) Switch $nmsg Case $GUI_EVENT_CLOSE Exit Case $button $i += 1 GUICtrlSetData ( $label , $i ) $aAccelKey [ 0 ] [ 1 ] = 0 GUISetAccelerators
( $aAccelKey ) $ret = 0 EndSwitch If TimerDiff ( $tt ) > 1500 And $ret = 0 Then $aAccelKey [ 0 ] [ 1 ] = $button GUISetAccelerators
( $aAccelKey ) $tt = TimerInit ( ) $ret = 1 ;empèche de lancer GUISetAccelerators() inutilement EndIf WEnd
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
littlechiki
Niveau 3
Messages : 48 Enregistré le : sam. 13 avr. 2019 13:58
Status :
Hors ligne
#8
Message
par littlechiki » dim. 15 sept. 2019 12:49
Ça a presque atteint la perfection là ! merci, Je vais me servir de ça !
Maintenant pour atteindre la perfection, je me demandais, y aurait pas moyen de relancer le timer a chaque fois que le bouton est pressé ? Là ça empêcherait vraiment d’incrémenter car à chaque fois, on lui dirait d'incrémenter seulement si TimerDiff($tt) > 50 par exemple mais comme il relancerait le timer à chaque pressage de bouton, il n'atteindrait 50 que si on relâchait le bouton. Après je sais pas si ça serait possible...
Mais c'est déjà proche de la perfection comme ça !
walkson
Modérateur
Messages : 1020 Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status :
Hors ligne
#9
Message
par walkson » dim. 15 sept. 2019 14:58
Bonjour,
Je pense que le problème est mal posé et de rattacher une touche à un bouton (dans ce cas) est une mauvaise idée.
Je vous propose d'utiliser HotKeySet() pour la touche et le bouton indépendamment comme ceci
#include <Misc.au3> $Gui = GUICreate ( "" , 400 , 50 ) Local $input = GUICtrlCreateInput ( 0 , 10 , 20 , 50 , 25 ) $button = GUICtrlCreateButton ( "clic" , 100 , 20 , 50 , 25 ) GUISetState ( ) Global $a = 0 , $b = 1 HotKeySet ( "{F2} " , "clic" ) While 1 $msg = GUIGetMsg ( ) Select Case $msg = - 3 Exit case $msg = $button $a = GUICtrlRead ( $input ) $a += $b GUICtrlSetData ( $input , $a ) EndSelect WEnd Func clic
( ) $a = GUICtrlRead ( $input ) $a += $b GUICtrlSetData ( $input , $a ) $b = 0 Do If _IsPressed ( "71" ) = False Then $b = 1 ;F2 relaché quitte la boucle Until $b = 1 EndFunc
$i s'incrémente de 1 à chaque appel du bouton ou de F2
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
walkson
Modérateur
Messages : 1020 Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status :
Hors ligne
#10
Message
par walkson » dim. 15 sept. 2019 15:48
Remarquez, on peut le faire comme ceci
#include <WindowsConstants.au3> #include <GUIConstantsEx.au3> #include <Misc.au3> $gui = GUICreate ( "Ma GUI" , 500 , 250 ) $button = GUICtrlCreateButton ( "Affichage" , 100 , 100 , 130 , 40 ) Global $label = GUICtrlCreateLabel ( "i = 0" , 100 , 150 , 130 , 20 ) Global $i = 0 , $rep = 1 GUISetState ( @SW_SHOW , $gui ) Local $aAccelKey [ 1 ] [ 2 ] = [ [ "{F2} " , $button ] ] GUISetAccelerators
( $aAccelKey ) While 1 Switch GUIGetMsg ( ) Case $GUI_EVENT_CLOSE Exit Case $button $i += $rep GUICtrlSetData ( $label , "i = " & $i ) $rep = 0 $aAccelKey [ 0 ] [ 1 ] = 0 GUISetAccelerators
( $aAccelKey ) Do If _IsPressed ( "71" ) = False Then $rep = 1 Until $rep = 1 $aAccelKey [ 0 ] [ 1 ] = $button GUISetAccelerators
( $aAccelKey ) EndSwitch WEnd
mais il faut désactiver GUISetAccelerators() pour l’empêcher d'incrémenter $i. Perso, je préfère la solution au-dessus
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
littlechiki
Niveau 3
Messages : 48 Enregistré le : sam. 13 avr. 2019 13:58
Status :
Hors ligne
#11
Message
par littlechiki » dim. 15 sept. 2019 18:51
Oh merci ça marche parfaitement ! Je trouve aussi que la méthode avec le hotkeyset est meilleure mais comme je devrais me servir de la touche si je sors de l'application, je vais me servir de l'accelerator (tout en gardant l'idée du hotkeyset sous la main).
En tous cas, un grand merci pour ça ! Je passe le sujet en résolu !