2016-06-29 4 views
2

Der folgende Code funktioniert für Ctrl +D, F2 und F7, aber funktionieren nicht für Ctrl +A. Wer weiß, was das Problem sein könnte?VB.net Tastenkombinationen funktionieren nicht

Private Sub AgentSetupForm_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown 
    Select Case e.KeyCode 
     ' Ctrl + A 
     Case Keys.A And (e.Control And Not e.Shift And Not e.Alt) 
      Dim f As New InvestorAccountsForm 
      f.MdiParent = TraderoomMDI 
      f.Show() 

      ' Ctrl + D 
     Case Keys.D And (e.Control And Not e.Shift And Not e.Alt) 
      Dim f As New InvestorAddressForm 
      f.MdiParent = TraderoomMDI 
      f.Show() 
      ' F2, F7 
     Case Keys.F2 'And (e.Shift And Not e.Control And Not e.Alt) 
      Me.Text = "F2 Test" 
     Case Keys.F7 
      stlFormMode.Text = "Edit" 
    End Select 

End Sub 
+1

Da Strg-A die Windows-Verknüpfung für "Alles Text auswählen" ist, wird die Tastenkombination möglicherweise erfasst, bevor sie den allgemeinen KeyDown-Handler Ihres Formulars erreicht. Was passiert, wenn Sie stattdessen das PreviewKeyDown-Ereignis versuchen? – Heinzi

+0

Stellen Sie sicher, dass die KeyPreview-Eigenschaft des Formulars True ist – topshot

+0

Die KeyPreview wird auf TRUE festgelegt und nichts passiert mit dem PreviewKeyDown-Ereignis. Tatsächlich trifft es im Debuggen nicht einmal. Ich dachte darüber nach, dass STRG + A alles auswählen würde, aber es sollte einen Weg geben, das zu überschreiben ... nun, vielleicht. – Levi

Antwort

0

EDIT:

Wie es scheint, dass Sie ein Problem haben mit der CTRL +A Kombination, Sie versuchen, ProcessCmdKey zwingende könnten und sehen, ob das funktioniert. Die Methode sollte aufgerufen werden, bevor die Schlüssel von der .NET-Umgebung behandelt und/oder übersetzt werden.

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, keyData As System.Windows.Forms.Keys) As Boolean 
    If keyData = (Keys.Control Or Keys.A) Then 
     ...your code here... 
     Return True 
    End If 

    Return MyBase.ProcessCmdKey(msg, keyData) 
End Function 

Wenn die anderen Kombinationen arbeiten können Sie sie in der KeyDown Ereignis halten.


EDIT 2:

@BozhidarStoinev ist recht, was er sagt; Ich habe mich geirrt, dass du gerade das bitweise And verwendest.

Scheinbar funktioniert es mit And oder AndAlso in Select Case-Anweisungen aufgrund der wie boolesche Werte in VB.NET konvertiert werden. In diesem Fall, solange der erste Operator nur And ist, wird es dir gut gehen. Die folgenden AndAlso s werden verwendet, da sie einen Kurzschluss ausführen, der schneller ist, weil AndAlso nur die rechte Seite bewertet, wenn die linke Seite True ist.

wie folgt zusammen:

Keys.A And (e.Control AndAlso Not e.Shift AndAlso Not e.Alt) 

wandelt entweder:

(65 And True) = (65 And -1) = 65 'I added parentheses for improved readability 

oder:

(65 And False) = (65 And 0) = 0 

Es ist nicht sicher, dass mit mehreren Anweisungen Fällen jedoch jedes Mal funktioniert. Es könnte für Schlüssel funktionieren, aber da <anything> And False gleich Null ist, besteht eine Chance für unerwartete Ergebnisse, wenn Sie in einem anderen Case auf 0 überprüfen.

+0

Also änderte es zu einer if-Anweisung mit Ihren Empfehlungen. Strg + A hat immer noch nicht funktioniert. Habe ich etwas verpasst? – Levi

+0

Wenn e.KeyCode = Keys.A AndAlso (e.control AndAlso Nicht e.Shift AndAlso Nicht e.Alt) Dann Dim f As New InvestorAccountsForm f.MdiParent = TraderoomMDI f.Show() ElseIf e.KeyCode = Keys.D AndAlso (e.control AndAlso Nicht e.Shift AndAlso Nicht e.Alt) Dann Dim f As New InvestorAddressForm f.MdiParent = TraderoomMDI f.Show() ElseIf e.KeyCode = Keys.F2 Dann Me .Text = "F2 Test" ElseIf e.KeyCode = Tasten.F7 Dann stlFormMode.Text = "Bearbeiten" Ende Wenn – Levi

+0

@Levi: Warte mal, werde es versuchen. Ich schrieb die Antwort auf mein Handy, so dass das Debugging nicht möglich war. Hast du versucht eine MessageBox oder sowas anzuzeigen? –

1

Die angenommene Antwort ist völlig falsch. VB.NET ist nicht C#. Wenn also And in einem Kontext mit s (auf beiden Seiten) verwendet wird, schaltet VB.NET automatisch auf logisch And im Gegensatz zu bitweise And. Das ist also überhaupt kein Problem. Ich habe einfach den OP-Code ausgeführt und es lief gut - Strg + Eine Kombination wurde erfolgreich erfasst. Wenn eine Tastenkombination etwas für das Betriebssystem (oder eine andere Komponente) bedeutet, heißt das nicht, dass sie nicht in unserer Anwendung erfasst wird.

Der Unterschied zwischen And und AndAlso besteht darin, dass der erste die booleschen Ausdrücke von links nach rechts bis zum Ende auswertet, obwohl einige der Ausdrücke False ergeben. Das spätere wertet Ausdrücke aus, bis es False erreicht oder bis zum Ende - das ist Kurzschluss.

Um die Lesbarkeit Ihres Codes zu verbessern, können Sie einen bestimmten Schlüssel unter der Case-Anweisung testen. Dann fügen Sie ein If Block im konkreten Fall den Zustand der Steuertasten zu überprüfen:

Select Case e.KeyCode 
    Case Keys.A 
     If e.Control AndAlso Not (e.Shift OrElse e.Alt) 
      Dim f As New InvestorAccountsForm 
      f.MdiParent = TraderoomMDI 
      f.Show() 
     End If 
    ' 
    ' 
End Select 

Oder Sie können den If Block ausklammern die Select Case für alle Fälle zu umarmen über den Zustand e.Control AndAlso ....

Leider kann ich Ihre Frage nicht beantworten, da es scheint, dass Ihr Problem nicht (einfach) reproduziert werden kann. Basierend auf den Kommentaren handelt es sich eher um Hardware- oder Treiberprobleme als die Case-Anweisungen in Ihrem Code.

+0

Ich verstehe. Der Grund, warum es funktioniert, ist, dass 'Keys.A And True' 65 zurückgibt, wahrscheinlich weil' True' in -1 konvertiert wird, was zu '65 And -1 = 65' führt. 'Keys.A And False' ergibt' 65 und 0 = 0'. Ich bin mir nicht sicher, ob diese Logik in allen Situationen funktionieren wird. –

+0

Ich habe auch meine Antwort aktualisiert und die falsche (n) Aussage (n) entfernt. Danke für die Klarstellung! –

Verwandte Themen