Simulation d'appui de touche clavier

Signaler
Messages postés
15
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
23 janvier 2008
-
 lolo3670 -
Bonjour à tous!

Ce doit être mon premier post sur le Forum.

Je suis en train de mettre en place un petit programme FreeWare dédié au jeu Falcon4 (simulateur).
Pour ce programme j'aurais besoin de simuler l'appui d'une touche au clavier.
J'ai essayé Sendkeys et une fonction equivalente que j'ai trouvé sur vbfrance mais sans succès.
J'arrive bien à envoyé des touches vers Word ou Notepad mais pas Falcon.

Je sais qu'il est possible d'attaquer le clavier sur une couche encore plus basse en le "hookant", cela vaut-il la peine d'essayer. QQun aurait il une fonction vb6 simple pour envoyer un caractère clavier par ce biais.

S'il y a un specialiste Falcon4 je suis preneur. Pour ceux qui connaissent j'ai fait la même demande auprès des équipes Freeware BMS et Eagle9.

Autre question : y a t'il moyen d'envoyer un caractère par DirectX car je me demande si Falcon4 n'utilise pas DirectX.

Merci d'avance

PS : je vous dévoile la finalité : développer un driver Goflight pour Falcon4.
Post sur CheckSix ici :
http://www.checksix-forums.com/forums/index.php?showtopic=42344

11 réponses

Messages postés
1352
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
19 novembre 2008
1
Salut,

C'était trop facile avant dans le MS DOS 6.22 où dans nos programmes on utilise le Port[$60] pour simuler une touche enfoncée.
Avant c'etait

Port[$60]:=Code touche

mais maintenant sous windows il faut


Option Explicit

Private Declare Sub keybd_event Lib "user32" Alias "keybd_event" ( _
        ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, _
        ByVal dwExtraInfo As Long)

' bVk est le code ascii de la touche
Private Const VK_LWIN = &H5B
Private Const VK_APPS = &H5D

' Pour d'autres touches...
' a à z 65 à 90
' Home 36
' End 35
' Flêche vers le haut 38
' Flêche vers le bas 40
' Flêche vers la gauche 37
' Flêche vers la droite 39
' Echap 27
' Impr écran 44 (= vbKeySnapshot)
' Page haut 33
' Page bas 34
' Insert 45
' F1 à F12 112 à 123
' Barre d'espace 32
' Ctrl 17
' Alt 18
' Maj 16
' Verr Num 144
' Arrêt défil 145
' Tab 9
' Shift 16

' bscan (Lorsque l'on utilise la touche imprime écran)
Const TheScreen = 1 ' Copie l'écran
Const TheForm = 0 ' Copie la fenêtre active

' dwFlags (le drapeau) :
Const KEYEVENTF_EXTENDEDKEY = &H1 ' Pour actionner les touches étendues
Const KEYEVENTF_KEYUP = &H2 ' Relache la touche

' ---Cet exemple montre comment gérer Windows---
Sub GestionWindows(Index As Integer)
' ---déclarations des variables---
Dim VK_ACTION As Long
' ---Traite l'action---
Select Case Index
Case 0 ' Ouverture de l'Exploreur
VK_ACTION = &H45 ' La lettre e (ascii 69)
Case 1 ' Rechercher des fichiers
VK_ACTION = &H46 ' La lettre f (ascii 70)
Case 2 ' Réduire toutes les fenêtres
VK_ACTION = &H4D ' La lettre m (ascii 77)
Case 3 ' Ouverture du menu exécuter
VK_ACTION = &H52 ' La lettre r (ascii 82)
Case 4 ' Actionner le menu démarrer
VK_ACTION = &H5B ' Le bouton démarrer de windows sur le clavier (ascci 91)
End Select
' ---Envoie de la séquence de touche---
Call keybd_event(VK_LWIN, 0, 0, 0)
Call keybd_event(VK_ACTION, 0, 0, 0)
Call keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0)
End Sub

Private Sub Command1_Click()
' ---Copie d'écran de la forme active (pour l'écran utiliser "TheScreen")---
keybd_event vbKeySnapshot, TheForm, 0&, 0&
' ---On laisse le temps à Windows de charger l'image en mémoire---
DoEvents
' ---Copie du presse-papier dans le contrôle image1---
Image1 = Clipboard.GetData(vbCFBitmap)
End Sub



Fonction keybd_event

Declare Sub keybd_event Lib "user32" Alias "keybd_event" ( _
ByVal bVk As Byte, _
ByVal bScan As Byte, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
Versions :
. Windows 95/98 : Oui
. Windows NT : A partir de 3.1
. Windows 2000/XP : Oui

Description :
Cette API permet de simuler des frappes au clavier tout comme vous le feriez.
bVk est le code ascii de la touche à envoyer au buffer clavier.
bScan est utilisé pour définir l'action de certaines touches spéciales comme "Imprime écran".
dwFlags est l'évènement que l'on souhaite génèrer comme KeyUp ou l'utilisation des touches étendues sur les claviers spéciaux.
dwExtraInfo permet d'ajouter une valeur supplémentaire à la touche actionnée.

Bonne chance !

:-p [mailto:cyberscorp2004@msn.com MSN] :big) [mailto:frop01@yahoo.fr YAHOO] >:)
Messages postés
15
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
23 janvier 2008

Merci Frop01 d'avoir pris de ton temps pour me répondre, mais dans la phrase:

"J'ai essayé Sendkeys et une fonction equivalente que j'ai trouvé sur vbfrance mais sans succès."

de mon post, c'est la methode que tu viens de me transmettre que j'ai trouvé sur vbfrance.

Merci bcp quand même. C'est sympa.
Messages postés
556
Date d'inscription
lundi 6 octobre 2003
Statut
Membre
Dernière intervention
31 octobre 2019

Bonjour,

Peut etre que ta mal utilisé sendkey. Va voir cette source.

Merci :approve) et @ Plus ;)

BIL@Loch
:)
Messages postés
406
Date d'inscription
lundi 2 décembre 2002
Statut
Membre
Dernière intervention
25 janvier 2014

'declaration pour presser une touche

Private Declare Sub keybd_event Lib "user32" ( _
ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)

essaye avec cette declaration car celle la elle fonctionne hors de la feuille du programme
vavoir ma source pour enregistrer est refaire les clic de souris
tu charge mon programme et tu essaye de le faire fonctionner sur
"Falcon."
si sa marche pas alors je ne croit pas que l'on connaisse la solution /

patrick
Messages postés
406
Date d'inscription
lundi 2 décembre 2002
Statut
Membre
Dernière intervention
25 janvier 2014

ne pas oublier qu'il faut appuyer et ensuite relacher la touche :

Call keybd_event(codedelatouche, 0, 0, 0)
Call keybd_event(codedelatouche, 0, 2, 0)

patrick
Messages postés
15
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
23 janvier 2008

Merci à tous, je jette un coup d'oeil à tout ça dans les jours qui viennet et vous tiens au courant. Pour info, l'envoi de caractères vers une autre appli fonctionne bien puisque j'envoie vers Word ou Notepad, c'est Falcon4 qui doit avoir un mode d'execution specifique qui refuse de prendre les caractères que je lui envoie.

Comme c'est un jeu et qu'il ne doit pas s'executer comme une fenêtre Windows classique, c'est la raison pour laquelle j'essaie d'attaquer le clavier dans un niveau plus bas que SendKeys.

Merci encore, à bientôt.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
66
Si c'est du DX, c'est cuit, DX passes directement par le materiel....

Amusez-vous ! ;)
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS
Messages postés
15
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
23 janvier 2008

Je pense en effet qu'il s'agit de DirectX puisqu'à l'install, Falcon4 le propose.
J'ai fait des recherches dans ce sens, bien entendu tous les codes proposés (et c'est comprehensible) lisent l'etat du clavier, mais aucun ne simule l'appui d'une touche(aucun interet pour un jeu).

D'apres ce que j'ai compris, en DirectX, il faut creer un device clavier avant de l'utiliser.
Dans mon cas, le device doit deja être créé puisque Falcon4 (le jeu) l'utilise.

Merci pour l'info en tout cas.

Quel casse-tête ....
Messages postés
15
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
23 janvier 2008

Alors j'ai fait le point ce WE sur toutes les solutions que vous me proposez... Rien ne marche.

Merci à tous pour vos reponses, c'est sympa.

Je vais m'orienter vers DirectX, en creant un device clavier... On verra bien.

J'ai vu qu'il y a pas mal de source sur le site.

Merci encore.
Je pense moi aussi que c'est du directX par contre j'ai la solution .
Il suffit d'utiliser la fonction SendInput de l'api windows.
Par contre je ne peux pas donner de code car je sais comment elle marche .
Mais j'i posté un message pour demander comment ça marche lien ici

En tout cas il faut utiliser sendinput

a+

ps: je sais que mon message peut être confus mais c'est la première fois que j'en poste un.
En fait je suis désolé je pensai que ça marchai mais ça ne marche pas il faut s'orienter vers aut'chose