Evénement KeyDown pour les touches de direction [Résolu]

Arnal88 96 Messages postés samedi 21 octobre 2006Date d'inscription 25 avril 2009 Dernière intervention - 29 sept. 2007 à 18:34 - Dernière réponse : jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention
- 29 sept. 2007 à 22:33
Bonjour,

Je suis en train de développer un petit jeu sous VB 2005, où je dois contrôler les déplacements du joueur à l'aide du clavier.

Le problème est le suivant : ma Form contient également plusieurs boutons, et c'est eux qui prennent le focus. Donc lorsque j'appuye sur gauche ou droite, cela déplace le focus d'un bouton à l'autre, mais ne déclenche pas l'événement KeyDown de ma Form...

Je tiens à préciser que j'ai bien mis Form.KeyPreview = True, et la Form intercepte les événements de tous les contrôles, mais cela ne marche pas pour les touches de direction !

Avez-vous une solution ?? Cela fait un moment que je bloque sur ce problème..

Merci par avance.
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 29 sept. 2007 à 20:56
3
Merci
Tiens (même pas besoin d'un booléenne) :

Essaye :

Une Form (avec Keypreview = True) , 2 boutons de commandes command1 et Command2 et une shape Shape1

et ce code :

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  If KeyCode = 112 Then
    ouinon = Not ouinon
    Command1.Enabled = Not Command1.Enabled
    Command2.Enabled = Not Command2.Enabled
    Exit Sub
  End If
  If KeyCode = 40 Then
    Shape1.Move Shape1.Left + 100, Shape1.Top + 100
  End If
End Sub
Lance !

Ici j'ai décidé de faire bouger avec la flêche basse et de changer d'état avec la touche F1

1) tu utilises la flêche basse : rien ne se passe
2) presse F1
3) la flêche basse devient opérationnelle
4) quand tu en as marre : de nouveau F1 ===>> la flêche basse est à nouveau ignorée.

Je n'ai rien d'autre de vraiment intelligent à te proposer

Merci jmfmarques 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de jmfmarques
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 29 sept. 2007 à 18:50
0
Merci
Salut
Chez moi, ça marche très bien :

PrivateSub Form1_KeyDown(ByVal sender AsObject, ByVal e As System.Windows.Forms.KeyEventArgs) HandlesMe.KeyDown
   If e.KeyCode = Keys.Up Then
      Debug.Print("Up")
   ElseIf e.KeyCode = Keys.Down Then
      Debug.Print("Down")
   ElseIf e.KeyCode = Keys.Left Then
      Debug.Print("Left")
   ElseIf e.KeyCode = Keys.Right Then
      Debug.Print("Right")
   EndIf
EndSubExplique où est ton problème

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Commenter la réponse de cs_Jack
Arnal88 96 Messages postés samedi 21 octobre 2006Date d'inscription 25 avril 2009 Dernière intervention - 29 sept. 2007 à 18:55
0
Merci
Est-ce que tu as placé deux ou trois boutons sur la Form ?
Commenter la réponse de Arnal88
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 29 sept. 2007 à 19:21
0
Merci
Bonjour,
Certains contrôles interceptent automatiquement pour leur prope compte la pression des touches Tab et flêches directionnelles, quelle que soit la valeur affectée à la propriété KeyPreview de la Form.
Si tu veux utiliser à tout prix ces flêches, il te faut "ruser" en y adjoignant la touche MAJ ou la touche ALT.
ou rncore t'y prendre autrement (appel de fonctions de l'Api de Windows pour intercepter et faire autrement que prévu par VB et le système), mais cela me parait à la fois démesuré et gauche
Commenter la réponse de jmfmarques
Arnal88 96 Messages postés samedi 21 octobre 2006Date d'inscription 25 avril 2009 Dernière intervention - 29 sept. 2007 à 19:35
0
Merci
Merci pour ces précisions..
C'est bien ce qui me semblait...

Mais alors comment faire ?
Je n'aime pas trop le fait de devoir appuyer sur Alt en même temps.

Est-ce que tu as une solution ?
Est-ce que je peux surveiller l'état du clavier ? J'utiliserais alors un Timer..
Commenter la réponse de Arnal88
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 29 sept. 2007 à 20:40
0
Merci
Je n'ai pas essayé, mais il me semble que ceci devrait pouvoir "marcher" :

1) choix d'une touche pour inhiber les contrôles "preneurs" (CommanButtons, OptionButtons et CheckBoxes)
2) Dans cet état, la prppriété KeyPreview ne devrait plus être gênér par leur présence et tes flêches directionnelles seront reconnues
3) A la fin de cette période, rétablir l'accessibilité des contrôles inhibés.
En d'autres termes : choisir une touche (ou ) permettant de passer ton application d'un stade à l'autre, si tu vois ce que je veux dire. Une seule touche, utilisée en "switch"/True/false devrait d'ailleurs largement suffire.
Commenter la réponse de jmfmarques
Arnal88 96 Messages postés samedi 21 octobre 2006Date d'inscription 25 avril 2009 Dernière intervention - 29 sept. 2007 à 20:44
0
Merci
Qu'est-ce que tu entends par "inhiber les contrôles" ? Les rendres inactifs (Enabled = False) ?
Commenter la réponse de Arnal88
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 29 sept. 2007 à 20:51
0
Merci
Oui, en effet, c'est un casse-tête.
Il existe un PreviewKeyDown sur les Button, mais il ne se déclenche que dans certains cas
Commenter la réponse de cs_Jack
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 29 sept. 2007 à 21:02
0
Merci
Euh...
Enlève donc cette booléenne ouinon que j'avais utilisée dans un 1er essai et qui n'est plus utile maintennt, hein ...
Commenter la réponse de jmfmarques
Arnal88 96 Messages postés samedi 21 octobre 2006Date d'inscription 25 avril 2009 Dernière intervention - 29 sept. 2007 à 21:04
0
Merci
Merci pour vos propositions.

Si je résume, voici ce que vous me proposez :

- Mettre Form.KeyPreview = True pour concentrer tous les événements KeyDown vers Form_KeyDown
- Définir une combinaison de touches (par exemple Alt-Espace) pour commencer à jouer. On inactive alors tous les contrôles qui captent les touches de direction (Button, RadioButton...)
- On peut alors avoir l'événement KeyDown avec les touches de direction.
- Quand on arrête de jouer, on réactive les contrôles (en appuyant à nouveau sur Alt-Espace par exemple)

Cela marche, mais c'est pas simple...
Mais apparemment, il n'y a pas d'autre possibilités... (merci Microsoft pour tant de simplicité !!)
Commenter la réponse de Arnal88
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 29 sept. 2007 à 21:11
0
Merci
Bon...
Tu peu bien évidemment (ce sera peut-être plus élégant)  utiliser un label avec caption = "jouer" puisque un label accepte le click (sans toutefois intercepter les touches directionnelles) pour changer d'état.
C'est plus "visuel" que l'emploi de F1.

Bonne nuit
Commenter la réponse de jmfmarques
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 29 sept. 2007 à 22:33
0
Merci
Une autre solution, enfin, mais à la condition que les seuls "gêneurs" sur ta Form soient des CommandButtons et qu'il n'y en ait pas d'autres (CheckBoxes ou OptionButtons, par exemple) :

Substituer à tes CommandButtons des PictureBoxes (elle acceptent le click et le double-Click sans toutefois intercepter les flêches directionnelles)

Voilà (je n'ai plus rien dans mon sac).
Commenter la réponse de jmfmarques

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.