Simulation d'appui de touche clavier

smerlo 15 Messages postés mercredi 28 juillet 2004Date d'inscription 23 janvier 2008 Dernière intervention - 31 août 2004 à 12:22 - Dernière réponse :  lolo3670
- 5 nov. 2012 à 18:08
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
Afficher la suite 

11 réponses

cs_frop01 1356 Messages postés lundi 27 octobre 2003Date d'inscription 19 novembre 2008 Dernière intervention - 31 août 2004 à 13:44
0
Utile
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] >:)
smerlo 15 Messages postés mercredi 28 juillet 2004Date d'inscription 23 janvier 2008 Dernière intervention - 31 août 2004 à 14:39
0
Utile
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.
bilaloch 554 Messages postés lundi 6 octobre 2003Date d'inscription 9 juillet 2014 Dernière intervention - 31 août 2004 à 14:53
0
Utile
Bonjour,

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

Merci :approve) et @ Plus ;)

BIL@Loch
:)
cs_clementpat 406 Messages postés lundi 2 décembre 2002Date d'inscription 25 janvier 2014 Dernière intervention - 31 août 2004 à 20:28
0
Utile
'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
cs_clementpat 406 Messages postés lundi 2 décembre 2002Date d'inscription 25 janvier 2014 Dernière intervention - 31 août 2004 à 20:35
0
Utile
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
smerlo 15 Messages postés mercredi 28 juillet 2004Date d'inscription 23 janvier 2008 Dernière intervention - 1 sept. 2004 à 11:58
0
Utile
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.
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscriptionModérateurStatut 18 janvier 2017 Dernière intervention - 1 sept. 2004 à 13:38
0
Utile
Si c'est du DX, c'est cuit, DX passes directement par le materiel....

Amusez-vous ! ;)
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS
smerlo 15 Messages postés mercredi 28 juillet 2004Date d'inscription 23 janvier 2008 Dernière intervention - 1 sept. 2004 à 21:49
0
Utile
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 ....
smerlo 15 Messages postés mercredi 28 juillet 2004Date d'inscription 23 janvier 2008 Dernière intervention - 4 sept. 2004 à 18:58
0
Utile
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.
0
Utile
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.
0
Utile
En fait je suis désolé je pensai que ça marchai mais ça ne marche pas il faut s'orienter vers aut'chose

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.