2009-10-22 9 views
6

J'ai déjàKeyPreviewvaleur true dans les propriétés du formulaireL'événement KeyDown ne se déclenche pas avec .NET WinForms?

Je travaille sur un petit programme, et je vais avoir un problème où il semble que certains des contrôles sur l'intérieur de groupe sont des ne déclenche pas l'événement KeyDown sur mon formulaire lorsque j'appuie et relâche une touche fléchée, juste l'événement KeyUp. Est-ce qu'il y a quelque chose qui ne va pas dans mon code? En particulier, j'ai activé KeyPreview sur le formulaire et défini des points d'arrêt sur e.SuppressKeyPress = True dans les deux sous-programmes, et seul celui de frmMain_KeyUp atteint le point d'arrêt.

J'ai ajouté dans les deux événements GroupBox en espérant que cela pourrait atténuer le problème, mais pas une telle chance. Cependant, j'ai un contrôle personnalisé sur le formulaire qui est spécifiquement codé pour ignorer ces touches, et le code fonctionne comme prévu.

Private Sub frmMain_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown, GroupBox1.KeyDown, GroupBox2.KeyDown 
     e.SuppressKeyPress = True 
     Select Case e.KeyCode 
      Case Keys.Left 
       ScrollDir = ScrollDir Or 1 
      Case Keys.Right 
       ScrollDir = ScrollDir Or 2 
      Case Keys.Down 
       ScrollDir = ScrollDir Or 4 
      Case Keys.Up 
       ScrollDir = ScrollDir Or 8 
      Case Else 
       e.SuppressKeyPress = False 
     End Select 
     tScroll.Enabled = True 
     tScroll_Tick(Nothing, Nothing) 
    End Sub 

    Private Sub frmMain_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp, GroupBox1.KeyUp, GroupBox2.KeyUp 

     e.SuppressKeyPress = True 
     Select Case e.KeyCode 
      Case Keys.Left 
       ScrollDir = ScrollDir And (Not 1) 
      Case Keys.Right 
       ScrollDir = ScrollDir And (Not 2) 
      Case Keys.Down 
       ScrollDir = ScrollDir And (Not 4) 
      Case Keys.Up 
       ScrollDir = ScrollDir And (Not 8) 
      Case Else 
       e.SuppressKeyPress = False 
     End Select 
     If ScrollDir = 0 Then tScroll.Enabled = False 
    End Sub 

Le code dans le contrôle utilisateur « ignore » les pressions de touche est en tant que tel:

Private Sub TileDropDown_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown 
     If e.KeyValue = 40 OrElse e.KeyValue = 38 OrElse e.KeyValue = 39 OrElse e.KeyValue = 37 Then 

      e.SuppressKeyPress = True 
     End If 
    End Sub 
+0

a établi un point d'arrêt dans le code de la commande qui l'ignore et voir si elle se déclenche au moins une fois – curtisk

+0

Avec 'e.SuppressKeyPress = TRUE uncommented dans le Gestionnaire frmMain KeyDown, le sous-programme TileDropDown_KeyDown n'est jamais appelé. Avec cela commenté, le gestionnaire * est * appelé. – Sukasa

Répondre

8

Certains contrôles intercepter les touches fléchées en cas keydown, mais pas en cas de keyup. Une solution consiste à dériver la classe de contrôle et de remplacer ProcessCmdKey:

Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keydata As Keys) As Boolean 

If keydata = Keys.Right Or keydata = Keys.Left Or keydata = Keys.Up Or keydata = Keys.Down Then 
    OnKeyDown(New KeyEventArgs(keydata)) 
    ProcessCmdKey = True 
Else 
    ProcessCmdKey = MyBase.ProcessCmdKey(msg, keydata) 
    End If 
End Function 
+0

Cela a fonctionné parfaitement, merci! – Sukasa

Questions connexes