[..] Boucle

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

[..] Boucle

#1

Message par Jerome »

Bonjour,

Je voudrait faire un script en faite qui soit tout le temps actif.
Si je presse une certaine touche, le script exécute l'action que je lui demande, et si je presse une autre touche (ou même la même ce qui serait optimal) le script se met en pause et reprend lorsque je lui dit de recommencer.

Code : Tout sélectionner

HotKeySet("{Esc}","quitter")

Func quitter()
   exit
EndFunc

#include <Misc.au3>



While 1
        If _IsPressed("04") Then
            While 1
                *Info*
            Wend
        EndIF
WEnd
 
J'ai actuellement fait sa, le probleme de HotKeySet dans ma fonction, c'est que sa me quitte le programme autoit.

Mon but étant que si j'apuit sur la molette de ma souris, le script commence et ne stop pas (boucle dans le Ispressed), si je re-appuie sur la molette, le script se met en pause, et recommence au moment ou je re-click sur la molette.

Je sait pas si c'est possible, si ce n'est pas le cas, alors avec une touche de mon clavier, comme tabulation.

Merci de votre aide.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Boucle

#2

Message par Tlem »

Ceci devrait plus ou moins fonctionner :

Code : Tout sélectionner

#include <Misc.au3>
$dll = DllOpen("user32.dll")


HotKeySet("{Esc}", "quitter")
Dim $Flag = 0

While 1
    If _IsPressed("04", $dll) Then
        If $Flag = 0 Then
            $Flag = 1
        ElseIf $Flag = 1 Then
            $Flag = 0
        EndIf
    EndIf

    If $Flag = 1 Then
        ;
        ; Votre code
        ;
    EndIf
Sleep(250)
WEnd

Func quitter()
    Exit
EndFunc   ;==>quitter
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [..] Boucle

#3

Message par Jerome »

Alors la première partie fonctionne (comme le mien), lorsque je click sur le bouton 3 de ma souris, le script se lance, par contre rien du tout ne se passe lorsque je reclick une deuxième fois, le script continu de s'exécuter.

Merci de toi aide.

Edit : Ce que je pense remarquer avec la variable Ispressed, c'est que si je re-appuis, sa fait quelque chose mais que la première continu de tourner. La boucle ne s'arrête jamais, comme si le fait d'exécuter un Ispressed ne coupait pas ceux déjà existant ??
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Boucle

#4

Message par Tlem »

En ce qui me concerne, ce code fonctionne correctement.
Maintenant, tout dépend du code que vous mettez après le If $Flag = 1.
Si votre code bloque le déroulement du script, alors la commande _IsPressed n'est pas exécutée suffisamment souvent et donc votre boucle continue ...
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [..] Boucle

#5

Message par Jerome »

c'est a dire que dans mon code il y a :

Code : Tout sélectionner

    If $Flag = 1 Then
        While 1
                   ; mon code
        Wend
    EndIf
Surement la boucle qui gène, y'a t'il un moyen de changer sa, sachant que je voudrait que la boucle se répete un nombre de fois indeterminé et qu'elle s'arrête au deuxième click sur la molette.
guitarist
Niveau 6
Niveau 6
Messages : 235
Enregistré le : mar. 02 déc. 2008 16:59
Status : Hors ligne

Re: [..] Boucle

#6

Message par guitarist »

Ne faut-il pas utiliser la boucle dont je me rappelle pas le nom :mrgreen: mais donc je sais que sa consiste à dire "Tant que" donc si tu met cette boucle en définissant un nombre peut-être que cela marcherai .
J'espère vous avoir été utile. :D
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Boucle

#7

Message par Tlem »

Vous n'avez pas besoin de remettre une boucle While ... Sinon c'est clair que ça ne peut pas fonctionner puisque le code est pris dans la boucle. :shock:

Mettez plutôt votre code sans la boucle, puisque dans ce que je vous ai proposé il y à déjà une boucle While gérée par le commutateur $Flag.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [..] Boucle

#8

Message par Jerome »

Hop, ben écoute, je pense avoir trouvé, mais je sait pas si la syntaxe est correcte :

Code : Tout sélectionner

#include <Misc.au3>
$dll = DllOpen("user32.dll")


HotKeySet("{Esc}", "quitter")
Dim $Flag = 0

While 1
    If _IsPressed("04", $dll) Then
        If $Flag = 0 Then
            $Flag = 1
        ElseIf $Flag = 1 Then
            $Flag = 0
        EndIf
        If $Flag = 1 Then
            Do
                ;
                ; mon code
                ;
            Until ( _IsPressed("04", $dll))
            $Flag = 0
        EndIf
    EndIf


Sleep(250)
WEnd

Func quitter()
    Exit
EndFunc   ;==>quitter
Problème résolut, par contre le code est - il syntaxiquement bon ou peut - on l'optimiser ?
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Boucle

#9

Message par Tlem »

Heuuuu, le code que je vous ait donné précédemment fonctionne très bien.
Maintenant si vous voulez rajouter des boucles dans la boucle, ça va être tendu et inutile, mais bon ...

Ne connaissant pas votre code, je ne peut vous en dire plus ...
A vous de voir pour la suite.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Boucle

#10

Message par Iste »

Oui moi je vois une optimisation !
un sleep(100) juste apres le If _IsPressed(), histoire d'eviter une activation/désactivation a cause d'un clic trop soutenu

Sinon, jevais essayer d'expliquer à Jerome pourquoi on s'étonne tous de le voir insister avec sa boucle ^^

Le script donné par Tlem est une boucle

Par conséquent, il execute tout son contenant automatiquement. Pas besoin d'autre boucle.

Dans cette boucle, on effectue que deux vérification

La 1er est If _IsPressed("04", $dll) Then
Donc, ce bout de code s'applique si l'on midle clic
Et ce bout de code inverse l'etat d'une variable (un booleen, un switch même)

Code : Tout sélectionner

If $Flag = 0 Then ;Si flag est a 0,
    $Flag = 1 ;on le met sur 1
ElseIf $Flag = 1 Then ;Et si il est sur 1,
    $Flag = 0 ;on le met a zero !
EndIf
Suite a ca, la boucle effectue une seconde vérification, If $Flag = 1 Then. Donc, le code s'effectue si la variable manipulable a l'aide de la condition précédente est vrai
Le code dans cette fonction s'effectura en boucle tant que la variable $flag n'aura pas changée
On change l'etat de cette variable a l'aide de la molette de la souris

Donc pas besoin de mettre une seconde boucle a l'intérieur !

Enfin, un conseil pour tous :
Essayez les code que l'on vous propose en exemple pour voir leur comportement, il sera enssuite plus simple de les comprendre

Voila, j'esepere que tu t'en sortiras avec ton script, sinon... on est la ^^
Signez ici
SagePourpre
Niveau 7
Niveau 7
Messages : 442
Enregistré le : dim. 06 juil. 2008 09:11
Status : Hors ligne

Re: [..] Boucle

#11

Message par SagePourpre »

Le seul soucis avec _ispressed, c'est qu'il est moins réactif que hotkeyset, donc il faudra peut-être que tu tiennes le bouton
(contrairement à hotkeyset qui réagit instantanément.

Idéalement, le mieux serait d'utiliser hotkeyset...

mais sinon, la solution de tlem fonctionne très bien.


Voiçi ma version, qui fait le même travail


J'ai ajouté un consolewrite qui va te permettre de voir un peu comment l'activation/désactivation du script fonctionne.

C'est la fonction _switch qui va changer ton flag...

Ce script contient 2 boucles.

la boucle

Code : Tout sélectionner

While 1

Wend
permet à ton script principal de rester ouvert pour pouvoir détecter en tout temps quand tu appuies sur le bouton
central de la souris.

Par défaut, ton script secondaire, celui qui exécute un code spécifique (par exemple cliquer à des endroits spécifiques sur
une page internet) sera activé seulement quand tu appuieras sur le bouton central de la souris.
Il est représenté par

_switch : Cette fonction vérifie la variable flag.

Si flag est égale à zéro, elle est mise à 1, si elle était à 1, elle est mise à 0. La fonction fait ensuite
une pause de 1000 ms afin de ne pas pouvoir être déclenchée à nouveau pendant ce bref laps de temps
(afin d'éviter la désactivation/réactivation du script trop rapidement)

Ensuite vient la boucle la plus importante

Code : Tout sélectionner

While $flag = 1
;code
_switch()
wend
Cette boucle se déclenche uniquement si la variable $flag est égale à un.
Dans ce script-ci, le seul moyen d'y parvenir est d'appuyer sur le bouton central de la souris.

Tant que $flag est égal à un, cette boucle s'exécutera. Pour l'arrêter, il suffit d'appuyer sur la touche
définie par ton script...

Voilà pourquoi _switch() apparaît une seconde fois à l'intérieur de cette boucle.



En gros, le script fait la même chose que celui de tlem...

Code : Tout sélectionner

#include <Misc.au3>
$dll = DllOpen("user32.dll")

HotKeySet("{Esc}", "quitter")
Dim $Flag = 0

While 1 ; Boucle qui permet à ton script d'être activé en tout temps (cette boucle ne se quitte qu'avec ESC)
    _switch()
    While $Flag = 1
        ; ton code quand _ispressed("04") est déclenché
        
        ;******************** Code *****************

        _switch()
    WEnd
    ; ton code quand _ispressed("04") est pressé à nouveau pour arrêter le script

    Sleep(250)
WEnd

Func _switch()
    If _IsPressed("04", $dll) Then
        Switch $Flag
            Case 0
                $Flag = 1
                ConsoleWrite("Script activé" & @CRLF)
            Case 1
                $Flag = 0
                ConsoleWrite("Script désactivé" & @CRLF)
                
        EndSwitch
        Sleep(1000)
    EndIf

EndFunc   ;==>_switch

Func quitter()
    Exit
EndFunc   ;==>quitter
Le Sage Pourpre, pour qui la vie est tellement
plus belle vue du haut de son Pouf = )
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Boucle

#12

Message par Tlem »

SagePourpre a écrit :En gros, le script fait la même chose que celui de tlem...
:lol: :lol: :lol: :lol:
Ben forcément, puisque c'est le même ... Sauf que vous, vous avez mis le changement du flag dans une fonction (ce qui fait plus propre).
Le mieux, aurait été de proposer le script avec un HotKeySet puisque vous en parlez. :P
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
SagePourpre
Niveau 7
Niveau 7
Messages : 442
Enregistré le : dim. 06 juil. 2008 09:11
Status : Hors ligne

Re: [..] Boucle

#13

Message par SagePourpre »

Je sais... Mais puisqu'il utilisait déjà hotkeyset pour quitter le programme, j'ai supposé qu'il choisissait
volontairement cette fonction afin d'associer la molette de la souris à son script. (hotkeyset ne gère pas
la souris à ma connaissance)
Le Sage Pourpre, pour qui la vie est tellement
plus belle vue du haut de son Pouf = )
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [..] Boucle

#14

Message par Jerome »

Effectivement, je vais tester ton script SagePourpre.

Ensuite, et bien après avoir compris ton message Iste, effectivement, une boucle dans une autre, pas top pour ce que je veux faire.

J'avais saisit la première idée du flag, mais pas la seconde, vu que c'était déjà une boucle.

Après y avoir réfléchit, je vais tester sans ma boucle, mais le script que je donne fonctionne et sa ma permis d'utiliser une boucle (do => until) que je n'avais jamais utilisé.

Sinon et bien, après avoir recherché dans l'aide d'Autoit, effectivement, HotKeySet ne gère pas la souris, contrairement à Is_pressed.

Je vous remercie pour votre aide, je vous donne les réponses de mes tests ce soir normalement.
Répondre