Evénement KeyDown pour les touches de direction

Résolu
Arnal88 Messages postés 96 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 avril 2009 - 29 sept. 2007 à 18:34
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 - 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.

12 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
29 sept. 2007 à 20:56
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
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
29 sept. 2007 à 18:50
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)
0
Arnal88 Messages postés 96 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 avril 2009
29 sept. 2007 à 18:55
Est-ce que tu as placé deux ou trois boutons sur la Form ?
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
29 sept. 2007 à 19:21
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
0

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

Posez votre question
Arnal88 Messages postés 96 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 avril 2009
29 sept. 2007 à 19:35
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..
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
29 sept. 2007 à 20:40
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.
0
Arnal88 Messages postés 96 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 avril 2009
29 sept. 2007 à 20:44
Qu'est-ce que tu entends par "inhiber les contrôles" ? Les rendres inactifs (Enabled = False) ?
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
29 sept. 2007 à 20:51
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
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
29 sept. 2007 à 21:02
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 ...
0
Arnal88 Messages postés 96 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 avril 2009
29 sept. 2007 à 21:04
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é !!)
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
29 sept. 2007 à 21:11
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
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
29 sept. 2007 à 22:33
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).
0
Rejoignez-nous