Page 1 sur 1

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

Posté : lun. 25 oct. 2010 17:47
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

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

Posté : lun. 25 oct. 2010 18:12
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...

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

Posté : lun. 25 oct. 2010 18:14
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?

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

Posté : lun. 25 oct. 2010 18:24
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...

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

Posté : lun. 25 oct. 2010 19:52
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

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

Posté : lun. 25 oct. 2010 20:25
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.

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

Posté : mar. 26 oct. 2010 11:07
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 :?

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

Posté : mar. 26 oct. 2010 12:20
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

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

Posté : mar. 26 oct. 2010 12:35
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:

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

Posté : mar. 26 oct. 2010 13:25
par legend
ouais désolé pour le msgbox ^^
c'était juste pour tester si le variable change de valeur.
bonne journée

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

Posté : mar. 26 oct. 2010 14:03
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

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

Posté : mar. 26 oct. 2010 15:00
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

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

Posté : mar. 26 oct. 2010 16:36
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é

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

Posté : mar. 26 oct. 2010 19:44
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

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

Posté : mar. 26 oct. 2010 19:57
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

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

Posté : mar. 26 oct. 2010 21:05
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 :)