2010-03-17 6 views
11

Ich versuche, den Tab Schlüssel in einer Windows Forms-Anwendung zu erfassen und eine benutzerdefinierte Aktion auszuführen, wenn es gedrückt wird.Wie Capture TAB-Taste in WinForms-Anwendung abfangen?

Ich habe ein Formular mit mehreren listViews und Schaltflächen, ich habe die KeyPreview -Eigenschaft des Formulars auf True festgelegt und wenn ich einen anderen Schlüssel als Registerkarte drücken, wird meine KeyDown-Ereignishandler aufgerufen.

Aber das ist nicht wahr mit dem Tab Schlüssel - Ich erhalte WM_KEYDOWN Nachricht auch in WndProc.

Muss ich jedes Steuerelement in meinem Formular festlegen - seine TabStop Eigenschaft - zu false? Es muss einen eleganteren Weg geben.

Danke.

Antwort

9

wird this Ihnen helfen?

Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean 
    Dim keyPressed As Keys = CType(msg.WParam.ToInt32(), Keys) 

    Select Case keyPressed 
    Case Keys.Right msgbox("Right Arrow Key Caught") 
    Case Keys.Left msgbox("LeftArrow Key Caught") 
    Case Keys.Up msgbox("Up Arrow Key Caught") 
    Case Keys.Down msgbox("Down Arrow Key Caught") 
    Case Else Return MyBase.ProcessCmdKey(msg, keyData) 
    End Select 
End Function 
+0

ja! Vielen Dank. Aus Gründen der Vollständigkeit musste ich das ProcessCmdKey-Ereignis von Form überschreiben und prüfen, ob (keyData & Keys.Tab) == Keys.Tab. – Axarydax

+1

Während dies theoretisch die Frage beantworten könnte, [wäre es vorzuziehen] (http://meta.stackexchange.com/q/8259), die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. –

28

Dies ist der C# Code ähnlich dem Code VB oben angegebenen Link ...

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     if (keyData == Keys.Tab) 
     { 
      //your code 
     } 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 

Hope this helps ...

+0

Sicher hat mir geholfen. Ein Upvote zum Bereitstellen des Codes für die Sprache, unter der die Frage getaggt wurde. – Logarr

+0

@Logarr: Froh, dass es geholfen hat :-) – Ram

+0

Als akzeptierte Antwort pleeease. – TechNyquist

5

You "PreviewKeyDown" Ereignis

+0

das ist einfach so einfach. Vielen Dank! – nawfal

-1
verwenden können
Private Sub form1_KeyDown(....) Handles Me.KeyDown 
    If e.KeyCode = Keys.Enter Then 
     SendKeys.Send("{tab}") 
    End If 
End Sub 
+0

das hat wirklich nichts mit der Frage zu tun - Sie fangen Enter-Taste und senden Tab danach ... – Axarydax