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
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
Code : Tout sélectionner
;HotKeySet("A","changeStatut_A")
HotKeySet("ESC","Quitter")
Func quitter()
Exit
EndFunc
#include <Misc.au3>
$dll=DllOpen("user32.dll")
$ACTIF=0
While 1
sleep(100)
If $ACTIF Then Send("C")
If _IsPressed(43,$dll) Then
$ACTIF=BitNOT($ACTIF) ; passer de 1 à 0, ou de 0 à 1.
EndIf
WEnd
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?
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.
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 :
...
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...

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!
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
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
