VB.NET Abfrage Probleme Return mit Enter Vernünftige abfrage Methode finden

  • VB.NET
  • .NET (FX) 4.0

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    VB.NET Abfrage Probleme Return mit Enter Vernünftige abfrage Methode finden

    Hallo zusammen es gibt dinge die offenbar unbegreiflich sind.
    Symptome er geht jedesmal in den Return bereich gleichgültig ob Return, neben den Nummern Tasten die Enter Taste anwende.
    Habe 4 Methoden probiert und keine schlägt an.
    Würde mich auf eine Vernünftige Lösung freuen und ein guter Beispielcode um das problem zu beheben ist immer willkommen.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private variableMap_v1 As New Dictionary(Of String, Keys) From {
    2. {"Key_Enter", Keys.Enter},
    3. {"Key_Return", Keys.Return}
    4. }
    5. Private variableMap_v2 As New Dictionary(Of String, String) From {
    6. {"Key_Enter", "13"},
    7. {"Key_Return", "13"}
    8. }
    9. Dim variableName_Enter As String = "Key_Enter"
    10. Dim variableName_Return As String = "Key_Return"
    11. Private Sub TextBox5_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox5.KeyDown
    12. 'Methode 1 Fehlgeschlagen
    13. 'If e.KeyCode = Keys.Return Then '&HD
    14. ' TextBox5.Text = "Return-Taste"
    15. 'ElseIf e.KeyCode = Keys.Enter Then
    16. ' TextBox5.Text = "Enter-Taste"
    17. 'End If
    18. 'Methode 2 Fehlgeschlagen
    19. 'If variableMap.ContainsKey(variableName_Return) Then
    20. ' ' Die Return-Taste wird verwendet
    21. ' TextBox5.Text = "Return-Taste"
    22. 'ElseIf variableMap.ContainsKey(variableName_Enter) Then
    23. ' ' Die Enter-Taste wird verwendet
    24. ' TextBox5.Text = "Enter-Taste"
    25. 'End If
    26. 'Methode 3 Fehlgeschlagen
    27. 'If variableMap.ContainsKey(variableName_Return) AndAlso variableMap(variableName_Return) = Keys.Return Then
    28. ' ' Die Return-Taste wird verwendet
    29. ' TextBox5.Text = "Return-Taste"
    30. 'ElseIf variableMap.ContainsKey(variableName_Enter) AndAlso variableMap(variableName_Enter) = Keys.Enter Then
    31. ' ' Die Enter-Taste wird verwendet
    32. ' TextBox5.Text = "Enter-Taste"
    33. 'End If
    34. 'Methode 4 Fehlgeschlagen
    35. If variableMap_v2.ContainsKey("Key_Return") Then
    36. ' Die Return-Taste wird verwendet
    37. TextBox5.Text = "Return-Taste"
    38. ElseIf variableMap_v2.ContainsKey("Key_Enter") Then
    39. ' Die Enter-Taste wird verwendet
    40. TextBox5.Text = "Enter-Taste"
    41. End If
    42. TextBox5.Text &= " # HexWert " & Hex(e.KeyValue.ToString())
    43. End Sub
    44. [/spoiler]


    mfg.
    Xiantrius

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Xiantrius“ ()

    @Xiantrius Was ist das Problem?
    Ich kann in Deinen Ausführungen nicht erkennen, was Du vorhast.
    Du befüllst ein Dictionary mit Werten und fragst danach, ob einer Werte darinnen ist.
    :?: :?: :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    es geht keiner der methoden weil bei beiden der Wert 13 drin ist. Das wusste ich schon bevor ich hier das Thread angefangen habe.
    Aber es muss doch irgendwie möglich sein das anständig abzufragen.
    Alle anderen gehen ja.
    Mir gings nur darum die frage was muss man rein schreiben damit der Unterschied erkannt wird?
    Würde mich freuen wenn jemand der wirklich Ahnung hat bereit ist mich und mit unter andere die das selbe problem haben zu unterstützen.
    Es muss so eine art Trick 17 geben.
    Ich hab auch schon API's probiert wie GetAsynckeystate, GetKeystate. Bisher konnte ich nicht wirklich was finden um das so abzufragen,wenn die Tasten passend gedrückt werden, dass die richtige Abfrage auch reagiert den leider tut es das nicht sondern nur Return auch wenn ich Enter drücke.
    Der Variable ist dennoch unterschiedlich, auch wenn die Werte in beiden fällen gleich sind und habe daher gehofft damit was erreichen zu können, doch leider tut er immer noch nicht was er soll.
    Wenn es absolut nicht geht, warum gibt es Keys.Enter und Keys.Return? Ergibt für mich nicht wirklich sinn wenn beide die gleichen Werte nutzen.
    Fakt ist die Tastatur hat eine Return und eine Enter Taste, also muss es ja irgendwie gehen.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Xiantrius“ ()

    Xiantrius schrieb:

    Mir gings nur darum die frage was muss man rein schreiben damit der Unterschied erkannt wird?
    Welchen Unterschied meinst du denn genau?

    Xiantrius schrieb:

    Fakt ist die Tastatur hat eine Return und eine Enter Taste, also muss es ja irgendwie gehen
    Nun meinst du das normale Enter und das NumPad-Enter?
    Tja das sieht schwieriger aus. Ich bin mir nicht sicher, ob Windows das an sich unterscheidet, fällt dir irgendeine Stelle ein, wo Enter geht und NumPad-Enter nicht?
    Aber @-Franky- weiß bestimmt wie man an solche Innereien kommt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Xiantrius schrieb:

    Würde mich freuen wenn jemand der wirklich Ahnung hat bereit ist mich […] zu unterstützen.
    Als ich das las, ist meine Motivation stark gefallen, da überhaupt was auszuprobieren, da jeder, der versucht zu helfen, aber keine Sofortlösung liefert, Gefahr läuft, disqualifiziert, ja sogar abgestraft zu werden, weil man ja laut dieser Aussage implizit eh keine Ahnung hat.

    Viele Wege führen ins Brom.
    Ich kenne einen: WndProc überschreiben. Bei mir klappt das hier ziemlich gut:

    VB.NET-Quellcode

    1. Friend Class TextBoxWhichDistinctsBetweenReturnAndEnter : Inherits TextBox
    2. ReadOnly CompareValue As New IntPtr(13)
    3. ReadOnly EnterKeyDown As New IntPtr(1835009)
    4. ReadOnly EnterKeyHold As New IntPtr(1075576833)
    5. ReadOnly EnterKeyUp As New IntPtr(-1071906815)
    6. ReadOnly ReturnKeyDown As New IntPtr(18612225)
    7. ReadOnly ReturnKeyHold As New IntPtr(1092354049)
    8. ReadOnly ReturnKeyUp As New IntPtr(-1055129599)
    9. Protected Overrides Sub WndProc(ByRef m As Message)
    10. If m.WParam = CompareValue Then
    11. If m.LParam = EnterKeyDown Then Console.WriteLine("Enter down")
    12. If m.LParam = EnterKeyHold Then Console.WriteLine("Enter hold")
    13. If m.LParam = EnterKeyUp Then Console.WriteLine("Enter up")
    14. If m.LParam = ReturnKeyDown Then Console.WriteLine("Return down")
    15. If m.LParam = ReturnKeyHold Then Console.WriteLine("Return hold")
    16. If m.LParam = ReturnKeyUp Then Console.WriteLine("Return up")
    17. End If
    18. MyBase.WndProc(m)
    19. End Sub

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Weiß jetzt nicht, ob das nur an den TE zum Testen geht oder (auch) an mich, aber bei mir kommt beides mal (Hauptentertaste, NumPad-Entertaste) Return raus.
    @Haudruferzappeltnoch: Ergänz mal bitte noch folgende Daten. Ich hab getestet mit: Win10, 64 Bit, .NET Framework 4.8.1.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Xiantrius schrieb:

    Würde mich freuen wenn jemand der wirklich Ahnung hat bereit ist mich und mit unter andere die das selbe problem haben zu unterstützen.
    Fang an und beschreibe Dein Problem so, dass wir genau das verstehen, was Du meinst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Haudruferzappeltnoch schrieb:

    Aber @-Franky- weiß bestimmt wie man an solche Innereien kommt

    Hmm, ich würde mal die
    Protected Overrides Function ProcessCmdKey ausprobieren. learn.microsoft.com/en-us/dotn…y?view=windowsdesktop-8.0 Die liefert neben den Keys auch eine Message. Bei Message mal schauen ob es da Unterschiede zwischen NumPad.Enter und Return bei lParam/wParam usw. gibt.
    Mfg -Franky-
    Es funktioniert mit STRG + C

    VB.NET-Quellcode

    1. Private Function Is_KeyPressed(ByVal key As Keys) As Boolean
    2. Return CBool(Control.ModifierKeys And CType(key = key, Keys))
    3. End Function
    4. Dim CheckText As New TextBox
    5. Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
    6. If Is_KeyPressed(Keys.Control) AndAlso Is_KeyPressed(Keys.C) Then
    7. ' Hier können Sie Ihre Logik für die Tastenkombination Strg + C einfügen
    8. CheckText.Text = CStr(MsgBox("Strg + C wurde gedrückt." & Environment.NewLine))
    9. Return True ' Gibt an, dass die Tastenkombination verarbeitet wurde
    10. End If
    11. ' Fügen Sie hier weitere Tastenkombinationen hinzu, falls erforderlich...
    12. Return MyBase.ProcessCmdKey(msg, keyData)
    13. End Function
    14. Private Sub KeyControll_Timer_Tick(sender As Object, e As EventArgs) Handles KeyControll_Timer.Tick
    15. TextBox1.Text = CheckText.Text
    16. End Sub

    Xiantrius schrieb:

    Es funktioniert mit STRG + C
    Würdest Du bitte mal belastbar erläutern, was Du eigentlich erreichen willst :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    PestnSchwefel!

    Scheinbar sind Haupt-Tastatur-Enter und Numpad-Enter die einzigen Tasten, wo tatsächlich vom Tastaturtreiber derselbe Code emitiert!

    Bei Allen anderen Tasten wird Numpad und Haupt-Tastatur klar unterschieden, nur bei Enter nicht.
    Auch mit Win-Api GetAsyncKeyState kriege ich kein anderes Ergebnis.

    Also der Code von post#8 ist durchaus relevant, um das Problem zu präsentieren: Bei jeder Taste unterscheidet sich Numpad von Haupt-Tastatur, nur bei Enter nicht.

    :(
    @ErfinderDesRades Ich kann dies bestätigen; das war mir nicht geläufig.
    @Xiantrius Was ist für Dich der Unterschied zwischen Return und Enter?
    Offensichtlich gibt es keinen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Xiantrius
    Den Unterschied zwischen Enter und Numpad-Enter hat Vapo schon gefunden in Post 7, es ist lParam (einmal 18612225 und einmal 1835009)
    Wenn du das getrennt abfragen möchtest, musst du also in deinem KeyDown-Event lParam einer Message ermitteln. Sowohl WndProc als auch ProcessCmdKey sind offenbar Funktionen, die automatisch mit einer solchen Message von intern aufgerufen werden. Durch ein Überschreiben dieser Funktion hast du die Möglichkeit reinzulinsen.

    Kannst du damit nun was anfangen?
    Es wäre interessant wenn jeder mal mein Code testet den das interessiert.
    Wenn ich jetzt neben den Nummertasten Enter drücke sagt er auch wirklich Enter gedrückt und bei Return wenn ich drücke kommt es
    Vielleicht kann man da noch was verbessern wegen der Performance.
    Der brauch etwas länger wie das sonst der fall ist, aber es funktioniert schon mal ganz gut bei mir.

    Herzlichen dank für die tollen hilfen an:
    @-Franky-
    @Haudruferzappeltnoch
    @ErfinderDesRades
    @VaporiZed

    VB.NET-Quellcode

    1. Dim CheckText As String
    2. ReadOnly CompareValue As New IntPtr(13)
    3. 'Return
    4. ReadOnly ReturnKeyDown As New IntPtr(1835009)
    5. ReadOnly ReturnKeyHold As New IntPtr(1075576833)
    6. ReadOnly ReturnKeyUp As New IntPtr(-1071906815)
    7. 'Enter
    8. ReadOnly EnterKeyDown As New IntPtr(18612225)
    9. ReadOnly EnterKeyHold As New IntPtr(1092354049)
    10. ReadOnly EnterKeyUp As New IntPtr(-1055129599)
    11. Private Sub FormLoadEinstellung()
    12. KeyControll_Timer.Interval = 100
    13. End Sub
    14. Protected Overrides Function ProcessCmdKey(ByRef m As Message, ByVal keyData As Keys) As Boolean
    15. If m.WParam = CompareValue Then
    16. KeyControll_Timer.Start()
    17. If m.LParam = EnterKeyDown Then CheckText = "Enter down"
    18. If m.LParam = EnterKeyHold Then CheckText = "Enter hold"
    19. If m.LParam = EnterKeyUp Then CheckText = "Enter up"
    20. If m.LParam = ReturnKeyDown Then CheckText = "Return down"
    21. If m.LParam = ReturnKeyHold Then CheckText = "Return hold"
    22. If m.LParam = ReturnKeyUp Then CheckText = "Return up"
    23. End If
    24. MyBase.WndProc(m)
    25. Return True
    26. End Function
    27. Private Sub KeyControll_Timer_Tick(sender As Object, e As EventArgs) Handles KeyControll_Timer.Tick
    28. KeyControll_Timer.Stop()
    29. TextBox1.Text = CheckText
    30. End Sub
    Was meinst du mit der braucht etwas länger? Wenn du Enter drückst vergehen 100ms bis der Text angezeigt wird, weil du da nen Timer zwischen gebaut hast mit 100ms.
    Die Bewandnis des Timer verschließt sich mir, deswegen kann ich ihn nur ignorieren.

    Wenn du keine modifizierte Textbox nutzen möchtest.
    Probiers mal so, immer lParam merken bei Enter-Eingabe und dann kannst wie gehabt im KeyDown EnterlParam checken.

    VB.NET-Quellcode

    1. Private EnterlParam As Integer
    2. Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean
    3. If keyData <> Keys.Enter Then Return MyBase.ProcessCmdKey(msg, keyData)
    4. EnterlParam = msg.LParam.ToInt32
    5. Return MyBase.ProcessCmdKey(msg, keyData)
    6. End Function
    7. Private Sub TextBox1_KeyDown(eventSender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown
    8. If e.KeyCode <> Keys.Enter Then Exit Sub
    9. TextBox1.Text = EnterlParam.ToString
    10. End Sub
    im KeyUp-Event hättest du automatisch dann auch die entsprechenden KeyUp lParams zur Verfügung. Also lässt sich so alles wie gewohnt mit den Events steuern.