[R] Simuler la pression d'une touche à l'infinie

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Raz2Kill
Niveau 2
Niveau 2
Messages : 22
Enregistré le : jeu. 02 sept. 2010 10:46
Status : Hors ligne

[R] Simuler la pression d'une touche à l'infinie

#1

Message par Raz2Kill »

Salut à tous

Voilà je cherche à créer un tout petit script qui me permettrait de simuler la pression d'une touche à l'infinie lorsque j'appuie dessus mais que lorsque je ré-appuie dessus,que cela s'arrête.J'ai déjà créé un script que voici

Code : Tout sélectionner

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

While
    If _IsPressed(43,$dll) Then
        Send("{C down}") 
        While
            If _IsPressed(43,$dll) Then
            Send("{C up}")
        WEnd
WEnd
Mais en le lançant j'ai ceci dans la console:
C:\Users\Florent\Desktop\BC2A.au3 (10) : ==> "Wend" statement with no matching "While" statement.:
WEnd
Donc voilà j'ai essayé de replacer ce WEnd mais sans succès.Par ailleurs si vous voyez un soucis dans mon script merci de me le faire savoir cela me ferait gagner du temps :roll:

Cordialement,
Raz2Kill
Modifié en dernier par Raz2Kill le mar. 26 oct. 2010 19:58, modifié 1 fois.

Code : Tout sélectionner

If Online_Assistant_Help ( "[b]Cool[/b]" , "[b]Listening[/b]" ) Then 
Show $PID
$PID=([b]Cordialement,Raz2Kill[/b])
Avatar du membre
sksbir
Niveau 7
Niveau 7
Messages : 384
Enregistré le : lun. 26 oct. 2009 17:57
Localisation : Lyon
Status : Hors ligne

Re: [..] Simuler la pression d'une touche à l'infinie

#2

Message par sksbir »

Bonsoir

il faut fermer tes "if" par des "endif"

A priori, ça ne peut pas marcher

Voici ce que j'ai testé:
► Afficher le texte
Mais, l'appui sur la touche C n'est pas toujours capturé, surtout lorsqu'il s'agit d'arreter la séquence. Et mettre 10ms au lieu de 100, et c'est carrément impossible à arrêter.

Pourquoi ?

A mon avis, le send("C") déboussole la fonction _ispressed d'une façon ou d'une autre...
Modifié en dernier par sksbir le lun. 25 oct. 2010 18:22, modifié 1 fois.
Raz2Kill
Niveau 2
Niveau 2
Messages : 22
Enregistré le : jeu. 02 sept. 2010 10:46
Status : Hors ligne

Re: [..] Simuler la pression d'une touche à l'infinie

#3

Message par Raz2Kill »

En fait ce script me permettrait de ne pas être obligé de maintenir la touche C pour m'accroupir dans un jeu.Il ne suffirait pas d'effectuer un boucle qui s'arrêterait en ré-appuyant sur la touche C?

Code : Tout sélectionner

If Online_Assistant_Help ( "[b]Cool[/b]" , "[b]Listening[/b]" ) Then 
Show $PID
$PID=([b]Cordialement,Raz2Kill[/b])
Avatar du membre
sksbir
Niveau 7
Niveau 7
Messages : 384
Enregistré le : lun. 26 oct. 2009 17:57
Localisation : Lyon
Status : Hors ligne

Re: [..] Simuler la pression d'une touche à l'infinie

#4

Message par sksbir »

Bon, le plus simple, ça serait d'utiliser une touche libre du clavier de façon à ne jamais avoir à toucher réellement la touche C si celle ci te sers pour le jeu...
Raz2Kill
Niveau 2
Niveau 2
Messages : 22
Enregistré le : jeu. 02 sept. 2010 10:46
Status : Hors ligne

Re: [..] Simuler la pression d'une touche à l'infinie

#5

Message par Raz2Kill »

J'aurais une meilleur idée.Le script garderais _ispressed sur la touche C mais son if renverrais à une touche vide que j'assigne ensuite dans le jeu.Logiquement cela pourrait marcher non? :P

EDIT:J'ai réussi à faire presque fonctionner le script!Le seul problème restant est que même si j'appuie sur C une deuxième fois,la touche X ne veux pas stopper sa pression :|

Code : Tout sélectionner

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

While 1
    If _IsPressed(43,$dll) Then
        While 1
        Send("{X down}")
        Sleep(100)
             
                If _IsPressed(43,$dll) Then
                Send("{X up}")
            EndIf
        
    WEnd
EndIf
WEnd

Code : Tout sélectionner

If Online_Assistant_Help ( "[b]Cool[/b]" , "[b]Listening[/b]" ) Then 
Show $PID
$PID=([b]Cordialement,Raz2Kill[/b])
Avatar du membre
legend
Niveau 7
Niveau 7
Messages : 472
Enregistré le : dim. 26 sept. 2010 12:55
Status : Hors ligne

Re: [..] Simuler la pression d'une touche à l'infinie

#6

Message par legend »

Ton script ne fonctionnera jamais parce que :
il y a une boucle while infinie dans une autre boucle while infinie.
une boucle while dans une autre boucle while bug.
la fonction _ispressed est trop trop rapide, donc quand tu apuiera sur c par exemple sa fera w down et w up plus que 3fois je suppose.
je conseille un hotkeyset.
voila le script qui m'a pris du temp (a cause des variables dans des if) mais sa fonctionne bien.
seul désavantage : la touche utilisée pour hotkey ne peut pas être utilisée pour écrire (dans cet exemple c)

Code : Tout sélectionner

$1 = 1
HotKeySet ("{c}", "apuier")
Func apuier()
    If $1 = 1 Then
        Send ("{w down}")
    Else
        Send ("{w up}")
        EndIf
        $1 = -$1
        MsgBox (0, "", $1)
EndFunc
while 1
    sleep (1000)
    WEnd
voila c'est simple et sa néssicite pas beaucoup de connaissances :)
faut juste savoir utiliser les variable.
Raz2Kill
Niveau 2
Niveau 2
Messages : 22
Enregistré le : jeu. 02 sept. 2010 10:46
Status : Hors ligne

Re: [..] Simuler la pression d'une touche à l'infinie

#7

Message par Raz2Kill »

Tout d'abord,merci pour ton code.

Malheureusement je crois que le jeu n'arrive pas à reconnaitre le script alors qu'il y arrive dans le mien qui est au dessus mais qui ne peut s'arrêter d'appuyer. :mrgreen:

Donc voilà je ne comprend plus où vient l'erreur :?

Code : Tout sélectionner

If Online_Assistant_Help ( "[b]Cool[/b]" , "[b]Listening[/b]" ) Then 
Show $PID
$PID=([b]Cordialement,Raz2Kill[/b])
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [..] Simuler la pression d'une touche à l'infinie

#8

Message par Jerome »

Coucou,


A tout hasard, tu aurait pas oublier de retirer :

Code : Tout sélectionner

MsgBox (0, "", $1)
...

PS : Sinon ton code ne fonctionne pas chez moi Legend.



Jérôme
Raz2Kill
Niveau 2
Niveau 2
Messages : 22
Enregistré le : jeu. 02 sept. 2010 10:46
Status : Hors ligne

Re: [..] Simuler la pression d'une touche à l'infinie

#9

Message par Raz2Kill »

Oui oui j'ai bien pensé à retirer la MsgBox mais rien n'y fait...Le jeu ne doit pas être compatible je vais essayer avec un autre pour voir et je vous dit... :wink:

Code : Tout sélectionner

If Online_Assistant_Help ( "[b]Cool[/b]" , "[b]Listening[/b]" ) Then 
Show $PID
$PID=([b]Cordialement,Raz2Kill[/b])
Avatar du membre
legend
Niveau 7
Niveau 7
Messages : 472
Enregistré le : dim. 26 sept. 2010 12:55
Status : Hors ligne

Re: [..] Simuler la pression d'une touche à l'infinie

#10

Message par legend »

ouais désolé pour le msgbox ^^
c'était juste pour tester si le variable change de valeur.
bonne journée
Raz2Kill
Niveau 2
Niveau 2
Messages : 22
Enregistré le : jeu. 02 sept. 2010 10:46
Status : Hors ligne

Re: [..] Simuler la pression d'une touche à l'infinie

#11

Message par Raz2Kill »

Le problème doit venir de mon ordinateur car rien ne se passe! :cry:

Voici le code au cas ou j'ai raté quelque chose:

Code : Tout sélectionner

$1 = 1
HotKeySet ("{c}", "apuier")
Func apuier()
    If $1 = 1 Then
        Send ("{x down}")
    Else
        Send ("{x up}")
        EndIf
        $1 = -$1
EndFunc
while 1
    sleep (1000)
    WEnd

Code : Tout sélectionner

If Online_Assistant_Help ( "[b]Cool[/b]" , "[b]Listening[/b]" ) Then 
Show $PID
$PID=([b]Cordialement,Raz2Kill[/b])
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [..] Simuler la pression d'une touche à l'infinie

#12

Message par Jerome »

Coucou,

Quelque chose qui fonctionne chez moi :

Code : Tout sélectionner

#include <Misc.au3>
global $test = 0
While 1

    If _IsPressed(43) and $test = 0 Then
        fonction()
        sleep(1000)
    EndIf

WEnd

Func fonction()
    Do
        Send('{x down}')
        sleep(100)

        If _IsPressed(43) Then
            Send('{x up}')
            $test = 1
        EndIf
    Until($test = 1)
    $test = 0
EndFunc


Jérôme
Avatar du membre
SrBelial
Niveau 7
Niveau 7
Messages : 335
Enregistré le : jeu. 22 juil. 2010 11:29
Localisation : 81 et 31
Status : Hors ligne

Re: [..] Simuler la pression d'une touche à l'infinie

#13

Message par SrBelial »

attention aussi à une chose : le _IsPressed() peut avoir des comportements différents de ceux attendus dans certains cas :

=> temps d'attente entre deux tests trop long ou trop court
=> réglages clavier windows (pour WinXP : panneau de configuration > clavier) avec un fréquence de répétition trop rapide ou trop lent
=> autres cas exotiques ...

dans ces cas il peut se passer les choses suivantes :
=> soit les appels à _IsPressed sont trop espacés et tombent avant ou après que la touche soit considérée comme pressée
=> soit ils sont trop proches et sur deux tests (ou plus) consécutifs, la touche sera considérée comme étant pressée (donc activation puis désactivation immédiate)

donc à voir, il y a peut être des réglages à faire pour optimiser !
perso j'aurais une forte préférence pour un hotkeyset(), par contre un des inconvénients est qu'il faut faire attention à ne pas écraser un raccourci clavier existant dans le jeu .... car sinon au lancement du jeu il risque d'être à nouveau effacé
.-SrB-. The One
  • NON ! AutoIt n'est PAS un langage réservé à la réalisation de bots !
  • OUI ! AutoIt est un langage à part entière !
  • Dans SciTE sélectionnez 1 mot puis F1
  • Don't want english doc ?? go to documentation française !! >>ICI<<
[/size]
Avatar du membre
legend
Niveau 7
Niveau 7
Messages : 472
Enregistré le : dim. 26 sept. 2010 12:55
Status : Hors ligne

Re: [..] Simuler la pression d'une touche à l'infinie

#14

Message par legend »

c'est ce que j'ai deja dit :)
cependant est il possible de faire un hotkey qui ne désactive pas la touche donc quand on tape la touche du hotkey sa apellera la fonction et écrira en même temp.
Sinon il y a t'il un moyen pour écrire sans utiliser un send.
par exemple copier la lettre du script et la coller dans autre fenêtre (un controle send sa marche?)
sa donnera :

Code : Tout sélectionner

hoykeyset ("a", "a")
func a()
; fonction a faire
$fentre = winactive
controlsend ($fenetre, "", "", "a")
 
quelqun peut tester le code?
merci et bonne journée
Raz2Kill
Niveau 2
Niveau 2
Messages : 22
Enregistré le : jeu. 02 sept. 2010 10:46
Status : Hors ligne

Re: [..] Simuler la pression d'une touche à l'infinie

#15

Message par Raz2Kill »

Apparemment le code de Jerome fonctionne à merveille,j'ai également pris en compte le réglage ce répétition de clavier,merci à vous pour votre aide 8)

Sujet Résolu

Cordialement,
Raz2Kill

Code : Tout sélectionner

If Online_Assistant_Help ( "[b]Cool[/b]" , "[b]Listening[/b]" ) Then 
Show $PID
$PID=([b]Cordialement,Raz2Kill[/b])
Avatar du membre
legend
Niveau 7
Niveau 7
Messages : 472
Enregistré le : dim. 26 sept. 2010 12:55
Status : Hors ligne

Re: [R] Simuler la pression d'une touche à l'infinie

#16

Message par legend »

sauf que la boucle do . . . until fera a chaque fois un x down pendant 100ms
ce n'est pas trés remarquable mais sa a de l'effet.
de plus si tu apuie sur x pendant 110ms sa fait un x down et un x up (c comme t'a rien fait . . .)
enfin si tu dis que sa fonctionne tant mieu :)
Répondre