Tastatur eingaben erkennen und reagieren

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von lordknoblauch.

    Tastatur eingaben erkennen und reagieren

    Mahlzeit :thumbup:

    Ich brauch eure Hilfe für ein neues Projekt von mir.

    Ich möchte ein Programm schreiben das Tastatur eingaben (Barcodes mit einem Barcodescanner gescannt via USB) in einem Fremden Programm & Textbox (mit VB6 nicht von mir) erkennt und vergleicht mit vorher von mir definierten Strings und dann eine Tastenkombination ausführt.

    Wie würdet Ihr das auslesen/erkennen machen?
    - mit der GetWindowText function ? (im Zielfenster befinden sich allerdings mehrer Textfelder, dgv´s und Labels) <- Hierbei wäre es cool wenn ihr mir beistehen könnt ;)
    - mit getasynckeystate & einem timer ? (erkennt die Methode so schnell alle Zeichen vom Scanner? , ist es clever den ganzen Tag einen Timer laufen zu lassen? )
    - mit global hotkey´s ???

    oder habt ihr noch eine bessere Idee?? ?(
    Hallo,

    Hier mal ein Ansatz:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer, ByVal fsModifier As Integer, ByVal vk As Integer) As Integer
    3. Private Declare Sub UnregisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer)
    4. Private Const Key_NONE As Integer = &H0
    5. Private Const WM_HOTKEY As Integer = &H312
    6. Private Eingabe As String
    7. Protected Overrides Sub WndProc(ByRef m As Message)
    8. 'die messages auswerten
    9. If m.Msg = WM_HOTKEY Then
    10. 'hier wird entschieden welcher hotkey es war
    11. 'einfach die übergebene id auswerten
    12. Select Case m.WParam
    13. Case 1
    14. Eingabe += "1"
    15. Case 2
    16. Eingabe += "2"
    17. Case 3
    18. Eingabe += "3"
    19. Case 4
    20. Eingabe += "4"
    21. Case 5
    22. Eingabe += "5"
    23. Case 6
    24. Eingabe += "6"
    25. Case 7
    26. Eingabe += "7"
    27. Case 8
    28. Eingabe += "8"
    29. Case 9
    30. Eingabe += "9"
    31. Case 10
    32. Eingabe += "0"
    33. End Select
    34. End If
    35. If Eingabe = "040001234441" Then
    36. Eingabe = ""
    37. MessageBox.Show("Das war die richtige Tastenkombination!")
    38. End If
    39. MyBase.WndProc(m)
    40. End Sub
    41. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    42. 'die Tasten wieder freigeben
    43. UnregisterHotKey(Me.Handle, 1)
    44. UnregisterHotKey(Me.Handle, 2)
    45. UnregisterHotKey(Me.Handle, 3)
    46. UnregisterHotKey(Me.Handle, 4)
    47. UnregisterHotKey(Me.Handle, 5)
    48. UnregisterHotKey(Me.Handle, 6)
    49. UnregisterHotKey(Me.Handle, 7)
    50. UnregisterHotKey(Me.Handle, 8)
    51. UnregisterHotKey(Me.Handle, 9)
    52. UnregisterHotKey(Me.Handle, 10)
    53. End Sub
    54. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    55. 'Deine Keys (1,2,3,4,5,6,7,8,9,0 - Tasten) mit IDs von 1-10
    56. RegisterHotKey(Me.Handle, 1, Key_NONE, Keys.D1)
    57. RegisterHotKey(Me.Handle, 2, Key_NONE, Keys.D2)
    58. RegisterHotKey(Me.Handle, 3, Key_NONE, Keys.D3)
    59. RegisterHotKey(Me.Handle, 4, Key_NONE, Keys.D4)
    60. RegisterHotKey(Me.Handle, 5, Key_NONE, Keys.D5)
    61. RegisterHotKey(Me.Handle, 6, Key_NONE, Keys.D6)
    62. RegisterHotKey(Me.Handle, 7, Key_NONE, Keys.D7)
    63. RegisterHotKey(Me.Handle, 8, Key_NONE, Keys.D8)
    64. RegisterHotKey(Me.Handle, 9, Key_NONE, Keys.D9)
    65. RegisterHotKey(Me.Handle, 10, Key_NONE, Keys.D0)
    66. End Sub
    67. End Class

    Auch ohne Fokus werden die Eingaben verarbeitet und gewisse Dinge ausgeführt, die du bei Tastatureingaben haben willst. Mit diesem Code wird die Eingabe erst zurückgesetzt, wenn du die richtige Ziffernfolge eingegeben hast. Ich würde noch irgendwas einbauen, was die Keys nach einer gewissen Zeit ohne Eingabe zurücksetzt oder eine Taste mit der man die Eingabe zurücksetzten kann. Jetzt weißt du ja wie es geht. Einfach die Taste mit RegisterHotKey hinzufügen eine ID vergeben und diese ID mit dem Select Case abfragen und dementsprechend reagieren.

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom
    Hi
    besser wäre es ggf. einen Message-Hook für die Anwendung zu registrieren. Ich hab' das aber bisher nie gemacht und weiß auch nicht, ob's für andere Anwendungen geht. Ansonsten wäre es ggf. auch sinnvoll, die Sachen über Pipes auszutauschen oder eben der Ipc-Implementierung von .Net-Remoting.

    Gruß
    ~blaze~
    @ Switcherlapp97

    Vielen Dank für den Ansatz :D , ich werde es gleich mal versuchen :thumbup: und berichten :!:


    @ ~blaze~

    Das mit dem Message-Hook habe ich ebenfalls noch nie gemacht, mal gucken was ich finde.

    *EDIT
    Das Problem mit dem Hotkey ist das die registrierten Tasten jetzt keine Funktion mehr haben, also wenn ich das Programm teste und im Editor die Registrierten Tasten drücke werden sie abgefangen aber kommen leider im Editor auch nicht an :(

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

    @crash

    Ich kann jetzt nicht ganz verstehen, warum du dieses Thema bereits als Erledigt markiert hast. Du hast eigentlich noch keine zufriedenstellende Lösung bekommen und falls du selber etwas herausgefunden hast, wäre es sinnvoll das in diesem Thread zu erwähnen.

    crash schrieb:

    Das Problem mit dem Hotkey ist das die registrierten Tasten jetzt keine Funktion mehr haben, also wenn ich das Programm teste und im Editor die Registrierten Tasten drücke werden sie abgefangen aber kommen leider im Editor auch nicht an :(

    Das könnte sehr kompliziert werden und ist den Aufwand denke ich nicht wert. Nimm etwas Leichteres. Zum Beispiel könntest du Tastenkombinationen verwenden. Statt nur 0 eben AltGr+0, usw. Falls ein Programm diese Tastenkombinationen verwendet, funktioniert die in dem Programm nicht, aber viele Tastenkombinaitonen mit AltGr+Zahl gibt es denke ich nicht ;) Ansonsten kombinierst du die Zahlen mit einer F-Taste. Ich kenne kein Programm, das Tastenkombinationen mit den F-Tasten benutzt. Du kannst dann aber weiterhin die Tasten einzeln nutzen, wenn du nur Tastenkombinationen als Hotkeys hinzufügst.

    So machst du das mit den mehreren Tasten die gedrückt werden müssen, damit ein Befehl ausgeführt wird. Dazu brauchst du die Klasse aus diesem Thread. Folgenden Code schreibst du dann in deine Form:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents _hotkeyHandler As HotkeyHandler
    3. Private Eingabe As String
    4. Private Sub Form_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
    5. _hotkeyHandler.Dispose() 'wieder freigeben, sobald die Form geschlossen wird (sollte auch durch Finalisierung freigegeben werden)
    6. End Sub
    7. Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    8. _hotkeyHandler = New HotkeyHandler(Me)
    9. _hotkeyHandler.RegisterHotkey(Keys.Control Or Keys.D0)
    10. _hotkeyHandler.RegisterHotkey(Keys.Control Or Keys.D1)
    11. _hotkeyHandler.RegisterHotkey(Keys.Control Or Keys.D2)
    12. _hotkeyHandler.RegisterHotkey(Keys.Control Or Keys.D3)
    13. _hotkeyHandler.RegisterHotkey(Keys.Control Or Keys.D4)
    14. _hotkeyHandler.RegisterHotkey(Keys.Control Or Keys.D5)
    15. _hotkeyHandler.RegisterHotkey(Keys.Control Or Keys.D6)
    16. _hotkeyHandler.RegisterHotkey(Keys.Control Or Keys.D7)
    17. _hotkeyHandler.RegisterHotkey(Keys.Control Or Keys.D8)
    18. _hotkeyHandler.RegisterHotkey(Keys.Control Or Keys.D9)
    19. End Sub
    20. Private Sub _hotkeyHandler_HotkeyPressed(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles _hotkeyHandler.HotkeyPressed
    21. If e.KeyData = (Keys.Control Or Keys.D0) Then
    22. Eingabe += "0"
    23. MessageBox.Show(Eingabe)
    24. ElseIf e.KeyData = (Keys.Control Or Keys.D1) Then
    25. Eingabe += "1"
    26. ElseIf e.KeyData = (Keys.Control Or Keys.D2) Then
    27. Eingabe += "2"
    28. ElseIf e.KeyData = (Keys.Control Or Keys.D3) Then
    29. Eingabe += "3"
    30. ElseIf e.KeyData = (Keys.Control Or Keys.D4) Then
    31. Eingabe += "4"
    32. ElseIf e.KeyData = (Keys.Control Or Keys.D5) Then
    33. Eingabe += "5"
    34. ElseIf e.KeyData = (Keys.Control Or Keys.D6) Then
    35. Eingabe += "6"
    36. ElseIf e.KeyData = (Keys.Control Or Keys.D7) Then
    37. Eingabe += "7"
    38. ElseIf e.KeyData = (Keys.Control Or Keys.D8) Then
    39. Eingabe += "8"
    40. ElseIf e.KeyData = (Keys.Control Or Keys.D9) Then
    41. Eingabe += "9"
    42. End If
    43. If Eingabe = "040001234441" Then
    44. Eingabe = ""
    45. MessageBox.Show("Das war die richtige Tastenkombination!")
    46. End If
    47. End Sub
    48. End Class

    Mit dem Code wird, die Eingabe einer Zahl nur gemeinsam mit der Strg-Taste registriert. Der Code macht übrigens genau das selbe, wie der Code in meinem vorherigen Post nur eben das mit der Tastenkombination ist anders. Deshalb hier auch wieder: Die Eingabe wird erst zurückgesetzt wenn, die richtige Tastenkombination eingegeben wurde. Also ist das wieder nur ein Ansatz, den du noch verbessern und anpasst kannst/musst ;)

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom
    Bin ausersehenen auf erledigt gekommen und kann es nicht mehr rückgängig machen :whistling: :huh:

    Danke für deine mühen, aber ich glaube das bringt mich leider nicht weiter, da mein Programm ja erkennen soll wenn in einem Externen Programm ein Barcode(Zeichenkette) eingescannt wird.
    Oder hast du noch eine Idee ?( :)
    @crash

    Der Sinn deines Programms ist mir irgendwie unklar ?(
    Und noch eine Frage: Arbeitet dein (nicht das in VB6 von jemand anderem) Programm im Hintergrund oder schreibt man in deinem Programm in eine Textbox die Zahlenkombination? Es ist nicht ganz einfach zu erahnen, was du genau vorhast. Also erklär das bitte genauer, sonst geb ich dir nochmal fertigen Code, den du dann nicht mal gebrauchen kannst.

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom
    @ Switcherlapp97

    danke habe es mit WM_GETTEXT lösen können ;)

    Nun habe ich noch eine andere Frage:

    Wie kann ich eine lange IF schleife abkürzen, mit select case ??


    VB.NET-Quellcode

    1. If text4.ToString = ("000001") Then
    2. If x = ziel Then
    3. Zielfensterleeren()
    4. MsgBox("Barcode " & text4.ToString & " gefunden.")
    5. Else
    6. End If
    7. If text4.ToString = ("0000002") Then
    8. If x = ziel Then
    9. Zielfensterleeren()
    10. MsgBox("Barcode " & text4.ToString & " gefunden.")
    11. Else
    12. End If
    13. If text4.ToString = ("0000003") Then
    14. If x = ziel Then
    15. Zielfensterleeren()
    16. MsgBox("Barcode " & text4.ToString & " gefunden.")
    17. Else
    18. End If
    19. If text4.ToString = ("0000004") Then
    20. If x = ziel Then
    21. Zielfensterleeren()
    22. MsgBox("Barcode " & text4.ToString & " gefunden.")
    23. Else
    24. usw....


    Wenn ich es so löse bräuchte ich ca. 50 If abfragen und mehr ?(


    Also ich habe eine Liste mit vorgegebenen Zeichenketten(0000001 usw.) und ich möchte prüfen ob die vom User eingescannte String in meiner Vorgefertigten und erweiterbaren Liste existiert :pinch:


    Steh gerade auf dem Schlauch, vielleicht kommt es mir morgen auch von alleine :thumbsup:
    Wenn ich dich richtig verstanden habe, kannst du das einfach in eine Schleife packen und Zähler mit der .ToString()-Funktion anpassen.

    VB.NET-Quellcode

    1. For i = 0 To 50
    2. If text4.ToString = i.ToString("000000") Then '<- 6 Stellen
    3. '...
    4. End If
    5. Next


    In diesem Fall wird aus dem Integer i ein String erzeugt und alle "leeren" Stellen durch Nullen ergänzt, sodass es ein String mit 6 Stellen wird.

    Das heißt
    1 -> 000001
    25 -> 000025
    usw.