Visual basic vb 2010 keybd_event. Comment envoyer une direction (ie: gauche, dro

TheRubicant Messages postés 7 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 20 mars 2012 - 17 mars 2012 à 03:20
TheRubicant Messages postés 7 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 20 mars 2012 - 20 mars 2012 à 21:20
Bonjour, je travaille actuellement à développer quelques macros pour des jeux.
J'utilise VB 2010 Express et j'essaie d'utiliser l'API keybd_event

C'est super et ça fonctionne bien, cependant, je n'arrive pas à trouver le moyen d'envoyer une direction (flèche, exemple: droite, gauche, haut, bas)
Je ne veux pas utiliser les touches du numpad mais bien les flèches de directions sur le clavier.

J'ai fait quelques recherches sur le forum avec des exemples, mais il ne fonctionnent pas pour moi.

Voici les déclarations que j'y ai trouvées.

Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)

Private Const KEYEVENTF_KEYUP = &H2
Private Const VK_LEFT = &H25
Private Const VK_UP = &H26
Private Const VK_DOWN = &H28
Private Const VK_RIGHT = &H27

Les exemples m'indique que je doit utiliser le code de cette façon :

keybd_event(VK_UP, 0, 0, 0)
System.Threading.Thread.Sleep(30)
keybd_event(VK_UP, 0, KEYEVENTF_KEYUP, 0)
System.Threading.Thread.Sleep(30)

Pour une raison que j'ignore, aucune touche n'est envoyée. Lorsque j'essaie une autre touche simple du clavier, cela fonctionne très bien, seulement les flèches qui ne fonctionnent pas.

Si vous savez comment résoudre ce problème, s'il vous plait, j'apprécierais beaucoup!
Merci d'avance.

Serge

20 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 mars 2012 à 07:08
Bonjour,
je ne sais pas où tu es allé chercher ces valeurs de constantes, mais elles ne sont pas exactes.
flèche haute, par exemple, a pour code 38 et non 26 !
Ne pas confondre le code ASCII avec le code clavier

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 mars 2012 à 07:12
Voilà ce que tu trouverais sur ta machine en consultant MSDN (moi, je n'ai pas VBNet et suis donc allé chercher sur le site de MSDN ) :
Tapez le texte de l'url ici.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
TheRubicant Messages postés 7 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 20 mars 2012
19 mars 2012 à 15:57
ucfoutu, ce sont des hexa, elles sont équivalentes. &H26 = 38 = vbKeyUp = Keys.Up

Peu importe comment on veux l'exprimer, le problème ne semble pas venir de ce paramètre...
0
Utilisateur anonyme
19 mars 2012 à 16:33
Bonjour,

Attends, ça fait 3 fois que je lis ton message; quand tu dis:
trouver le moyen d'envoyer une direction (flèche, exemple: droite, gauche, haut, bas)

Tu veux dire que tu veux simuler ces touches?
comme "SendKeys.Send(Keys.Up)" ???


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 mars 2012 à 16:39
Et sur quoi te trouves-tu (appli, Form et contrôle) lorsque tu envoies cette séquence ?
Si pas sur une fenêtre de ton appli :
1) comment lui as-tu donné préalablement le focus ?
2) ne serait-ce pas une appli en Directx ?
Si fenêtre url ===>> certaines n'accepteront aucune simulation (uniquement le clavier physique)


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
19 mars 2012 à 20:34
Salut

pourquoi se servir d'api

Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
        If e.KeyCode = Keys.Left Then
            MessageBox.Show("you stroke left arrow")
        End If
        If e.KeyCode = Keys.Right Then
            MessageBox.Show("you stroke right arrow")
        End If
        If e.KeyCode = Keys.Up Then
            MessageBox.Show("you stroke up arrow")
        End If
        If e.KeyCode = Keys.Down Then
            MessageBox.Show("you stroke down arrow")
        End If
    End Sub
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 mars 2012 à 20:41
Bonjour ShayW,

parce que ce qu'il cherche à faire ,'est pas de savoir quelle touche il a utilisé, mais de simuler l'utilisation d'une touche
A destination de quoi ? Telle est la question (et sa réponse nous éclairera).


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 mars 2012 à 20:48
Relis et devine :
Bonjour, je travaille actuellement à développer quelques macros pour des jeux

Ce qui pourrait (je dis bien pourrait, au conditionnel, donc) se traduire par :
"je cherche à jouer, mais sans réellement (ou proprement) jouer"

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Utilisateur anonyme
20 mars 2012 à 01:14
Oui, il y a aussi ça:
Pour une raison que j'ignore, aucune touche n'est envoyée.
cependant, je n'arrive pas à trouver le moyen d'envoyer une direction (flèche, exemple: droite, gauche, haut, bas)


De toute évidence c'est bien envoyer.
Donc "Send" (en anglais) et donc SendKeys.Send (en VB.net).

Nous sommes tous d'accord?

Heureusement que nous avons tous une boule de cristal, parce que le demandeur a disparu...


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
TheRubicant Messages postés 7 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 20 mars 2012
20 mars 2012 à 04:11
acive:
Disparu? Nah.

Et lorsque j'aurai trouvé une solution fonctionelle, je vous assures que je vais mettre le post à jour.

J'avais dans le passé utilisé SendKeys mais je le trouvais beaucoup moins performant que keybd_event à plusieurs niveau. De plus, lors de multiples envois rapide, SendKeys ne livre pas la marchandise.

Je vais toutefois le réesayer et vous tenir au courant. Merci à tous pour l'aide jusqu'à présent.

ucfoutu, tu soulève un excellent point. Puisque c'est du directx, le focus n'est pas nécéssaire, du moins pour les touches de clavier normales. Sans avoir le focus avec un truc du genre de setfocuswindow, cela fonctionne. Peut-être que cela à ses limites et que je devrai considérer le focus de la fenêtre en obtenant le hWnd avec les veilles API... Dans ce cas ça serait vraiment dommage car je ne peux pas me permettre de délai entre l'application et le programme cible, cela doit être fluide et en temps réel...

Il s'agit d'un jeu de combat, disons que je programme une séquence de plusieurs coups en appuyant un seul bouton (en calculant les sleep vs les envois), alors un coup la séquence terminée le champ de lecture de macro doit être accessible intantanément... De plus avec des macros plus avancées, je permet l'arrêt de certaines macros en cours pour en lancer d'autre, il faut donc qu'à tout moment, mon programme principal puisse lire mes inputs. J'ai donc un problème si les flèches n'arrive pas à être transmise à directx, dommage car les autres touche du clavier le font, mais bon ce n'est qu'une hypothèse. Je vais faire des tests avec un focus et voir si ça fonctionne.

Si oui alors on pourra en tirer des conclusions. Je ferai ces tests demain soir et reviens mettre à jour sur le forum.
0
TheRubicant Messages postés 7 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 20 mars 2012
20 mars 2012 à 04:36
Eh bien. Il semble que ça n'ait rien à voir avec une question de focus.

J'ai fait les test et ce n'Est pas concluant. Puis j'ai même moi même cliquer sur la fenêtre du jeu durant une exécution, sans succès.

Même chose pour le sendkeys, il prend n'importe quelle autre touche.
Lorsque j'essaie SendKeys.Send("{UP}"), le jeu ne réagis pas.

Je continue mes recherches...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 mars 2012 à 07:21
Re,
Ce genre de sujet est un peu comme un serpent de mer. Il remonte à la surface au rythme des "élans" de certains mauvais joueurs.
Que ce soit en essayant Sendkeys, keybd_event ou SendInput ===>> certains jeux (notamment basés sur directinput) feront un joli pied de nez à tous les tricheurs (et c'est bien ainsi).




____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 mars 2012 à 07:31
Extrait du Cid :
Paroles du Comte :

.....
.....
Trop peu d'honneur pour moi suivrait cette victoire :
À vaincre sans péril, on triomphe sans gloire
....


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
20 mars 2012 à 10:43
Salut
pourquoi ne pas utiliser le double buffering
à la place du directx
tu peux obtenir le meme résultat pour éviter
les scintillements
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 mars 2012 à 10:53
Bonjour, ShayW,
pourquoi ne pas utiliser le double buffering
à la place du directx
tu peux obtenir le meme résultat pour éviter
les scintillements

Quelque détail m'aurait-il échappé ?
ou
Te serais-tu trompé de discussion ?
Je suis paumé, là !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
20 mars 2012 à 11:31
Salut Ucfoutu

non non tu ne t'es pas paumé

je ne sais pas si le problème de Therubicant est due au directx ?

quand on code avec directx on plus avec la fenetre de windows on fait accès directement
à la carte graphique
0
Utilisateur anonyme
20 mars 2012 à 12:35
Alors, je viens de tomber sur une discussion similaire en 2007 DANS CE LIEN:

Nous avons Julien qui dit:
En fait ce que tu veux faire est impossible pour une raison bien simple :
Ton jeu acquiert les données de ton clavier via DirectInput, qui reçoit les données directement du buffer clavier, à un niveau beaucoup plus bas que SendKeys ou keyb_event...
Désolé :p


Après nous avons le frère jumeau a ucfoutu qui dit:
Je viens de lire le lien auquel tu te réfères et qui semble parler d'une forme de sous-classement à bas niveau


Et finalement Greg dit:
exactement ce qu'il faut faire : - 1 Hooker la DLL : Directinput.dll que l'on remplace par une similitude coder main en c++ - 2 dans la code de la dll faire la simulation voulue - 3 reHooker pour remettre la vrais DLL et ainsi de pas perturber le jeux


(Pas testé tout ça...)


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
TheRubicant Messages postés 7 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 20 mars 2012
20 mars 2012 à 17:31
ucfoutu, oui oui l'honneur. Mon objectif principal c'est de réussir à faire fonctionner le tout et non la tricherie. Il est très rare que j'abandonne en plein milieu lorsque je commence à coder une interface.

ShayW, je dois t'avouer que je t'ai perdu. Je n'ai pas de contrôle de la façon que le jeux a été développé, j'essaie simplement de l'interfacer avec une application tierce sur laquelle j'ai le contrôle pour interagir avec le jeu. Éclaires-moi si je me trompes.

acive, intéressant, je ne suis pas certain si c'est applicable à mon cas puisque certaines touches sont reconnues mais je vais regarder. Ça semble complexe mais si ça fonctionne alors ça vaut la peine. Je regarde cela ce soir.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
20 mars 2012 à 20:45
ShayW, je dois t'avouer que je t'ai perdu

ah bon
Je n'ai pas de contrôle de la façon que le jeux a été développé


ce n'est pas toi qui le développe ?
quand tu dis directx tu veux dire directdraw
non ?

J'ai fait les test et ce n'Est pas concluant. Puis j'ai même moi même cliquer sur la fenêtre du jeu durant une exécution, sans succès.


c'est à dire le clique n'a pas été detecté ?
j'avais écrit un prog avec directx
ce n'est pas facile surtout ne pas mettre de
point d'arret ou lancer avec le debugger
0
TheRubicant Messages postés 7 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 20 mars 2012
20 mars 2012 à 21:20
Salut ShayW

Je t'expliques. le jeu en question est un jeu développé par une compagnie quelconque. De mon côté, j'ai développé un programme en vb.net pour faire des keydb_event à ce jeu. Le jeu lui à été développé avec du directx.

Pour ce qui est de la détection du clic, c'était simplement pour obtenir le focus manuel du jeu en question durant l'exécution de plusieurs envoi de flèches. Je l'ai aussi fait par programmation. La raison que je l'ai fait manuellement c'était pour m'assurer que ce n'était pas un problème d'implémentation.
0
Rejoignez-nous