2009-02-10 5 views
2

L'événement key up est déclenché lorsqu'une clé est relâchée. Cela est vrai pour les touches normales comme a, b etc. Cependant, maintenir la touche fléchée ou la touche d'échappement produit des résultats différents. Au lieu de déclencher un événement key up lorsque la touche est relâchée, elle se déclenche peu après l'événement de touche enfoncée. Ainsi, maintenir une touche fléchée devient égal à appuyer et relâcher la touche plusieurs fois très rapidement. Toute explication et contourner pour déterminer quand la clé est réellement libérée?événements de clavier dans .NET

Répondre

3

L'événement KeyUp n'est pas réellement déclenché (pour toutes les clés, pas seulement les touches fléchées, etc.) jusqu'à ce que vous relâchiez la touche, il y a juste plusieurs événements KeyDown répétés. Au moins, c'est comme ça que ça me vient d'un code de test.

Ma solution consiste à désactiver le gestionnaire KeyDown après un événement est détecté en utilisant KeyDown

RemoveHandler Me.KeyDown, AddressOf Form1_KeyDown 

puis re-validation lorsque l'événement KeyUp est déclenché.

AddHandler Me.KeyDown, AddressOf Form1_KeyDown 

Bien sûr, si vous voulez gérer plusieurs pressions simultanées, cela ne fonctionnera pas. Vous devrez stocker si la clé en question est déjà en panne et ignorer l'événement KeyDown respectif.

1

Je viens de rencontrer un problème similaire. gestionnaire de clavier se comporte bizarre:

Si le focus et les gestionnaires sont en zone de texte:

  • Lorsque la touche alphanumérique enfoncée, je suis arrivé plusieurs événements presse et vers le bas
  • Les flèches et les touches de fonction produisent des événements multiples vers le bas

Si vous gérez des événements pour un formulaire avec KeyPreview activé, seul l'événement KeyUp pour les touches fléchées est géré.

Il est possible de gérer toutes les clés au niveau inférieur en remplaçant ProcessCmdKey.

Si vous souhaitez gérer une flèche gauche:

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean 
    Select Case keyData 
     Case Keys.Left 
      Debug.WriteLine("Left") 
      Return True 
     Case Else 
      Return MyBase.ProcessCmdKey(msg, keyData) 
    End Select 
End Function 
Questions connexes