Tastatureingaben auswerten

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von fichz.

    Tastatureingaben auswerten

    yo Leute,

    ich muss in einem Programm Zahlen über die Tastatur (eigentlich von einem Handscanner) auswerten.
    Dazu fand ich die tolle Funktion GetAsyncKeyState.

    Damit diese Funktion auch funktioniert muss man diese über einen Timer laufen lassen (Polling).
    Gibt es dafür eine andere Möglichkeit außer Polling, da ich irgendwie nicht will, dass ständig ein Timer auf so kurzen Intervall laufen muss?

    Anbei mein derzeitiger Code:
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Windows.Forms;
    3. using System.Text.RegularExpressions;
    4. using System.Runtime.InteropServices;
    5. using System.Collections.Generic;
    6. namespace WindowsFormsApplication1
    7. {
    8. public partial class Form1 : Form
    9. {
    10. [DllImport("user32.dll")]
    11. public static extern int GetAsyncKeyState(Int32 i);
    12. string code = string.Empty;
    13. string identifier = "97838";
    14. List<Keys> keys;
    15. public Form1()
    16. {
    17. InitializeComponent();
    18. }
    19. private void Form1_Shown(object sender, EventArgs e)
    20. {
    21. keys = new List<Keys>();
    22. keys.Add(Keys.D0);
    23. keys.Add(Keys.D1);
    24. keys.Add(Keys.D2);
    25. keys.Add(Keys.D3);
    26. keys.Add(Keys.D4);
    27. keys.Add(Keys.D5);
    28. keys.Add(Keys.D6);
    29. keys.Add(Keys.D7);
    30. keys.Add(Keys.D8);
    31. keys.Add(Keys.D9);
    32. keys.Add(Keys.Return);
    33. timer1.Interval = 3;
    34. timer1.Start();
    35. }
    36. private void timer1_Tick(object sender, EventArgs e)
    37. {
    38. foreach(var item in keys)
    39. {
    40. int keyState = GetAsyncKeyState((int)item);
    41. if(keyState == 1 || keyState == -32767)
    42. {
    43. if(item == Keys.Enter)
    44. {
    45. if(code.StartsWith(identifier))
    46. textBox1.Text = "OK";
    47. else
    48. textBox1.Text = "NICHT OK";
    49. //listBox1.Items.Clear();
    50. code = "";
    51. break;
    52. }
    53. code += Regex.Match(((Keys)item).ToString(), @"\d+").Value;
    54. listBox1.Items.Add(code);
    55. break;
    56. }
    57. }
    58. }
    59. }
    60. }
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Sieht schon sehr gut aus, jedoch fängt das Programm dann diese Eingaben generell ab.
    Bedeutet, dass ich die Zahlen 0-9 zwar drücken kann, das Programm diese auch erkennt, aber zB in Notepad nicht mehr geschrieben werden.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Ja..... ich werd mal nochmal bei msdn in den Apis gucken... ev gibt auch nen Event was nur aufgerufen wird wenn eine Taste gedrückt wird. Aber weshalb verwendest du eig. nicht Keydown wenn du es sowieso nur dann haben willst wenn das Fenster aktiv ist?

    Lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    Ich will es ja eben, wenn das Fenster nicht aktiv ist ;)
    Hab ich oben vergessen zu erwähnen. Es wird eine Art Zeiterfassung wo ein Mitarbeiter seinen Strichcode, den er bei sich hat, scannt. Dieser soll dann vom Programm registriert und verarbeitet werden.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Das hab ich nicht so wirklich zum Laufen gebracht.
    Jedoch habe ich eine tolle Lib gefunden welche sich einfach zu bedienen lässt:
    github.com/gmamaladze/globalmousekeyhook
    Gibt es sogar als nuget Package:
    nuget.org/packages/MouseKeyHook
    Das macht genau das was ich will und werde ich mal testen.

    lg und Danke
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Jo, das mit Strichcode-Lesern scheint mir insgesamt eigentümlich: Preiswerte Fabrikate stellen "einfach" eine zusätzliche Tastatur dar, und das ist natürlich eiglich Mist.
    Weil mit einer Tastatur gibt man ja in jedes beliebige Programm ein, was bei Strichcode-Lesern ja absolut unerwünscht ist.

    Von teureren Fabrikaten hab ich gehört, dass die mit ihrer eigenen Software verheiratet sind, was mir auch logisch erscheint.

    Ein KeyboardHook hätte ja auch das Problem, dass er andersrum Tastatur-Eingaben der normalen Tastatur als Strichcode versucht zu interpretieren.

    Aber vlt. fehlt da auch einfach bischen KnowHow, wie man eine Tastatur evtl. identifizieren kann, oder an einen Dienst binden oder sowas.
    Also ich weiß nicht, wie das geht, aber scheinr mir iwie werkseitig fehl-konstruiert - das kann ja nicht vorgesehen sein, dass ein Strichcode-Leser seine Zahlenkolonnen in jedes beliebige Proggi einspeist, was grad den Focus hat.
    @ErfinderDesRades
    Da das Problem oft bei Flugzeugsimulatoren oder ähnlichem auftritt gibt es sogar eine Sprache dafür. Da ich aber denke, dass du diese nicht lernen willst, hier nen Stackoverflow Thread in dem Jemand das selbe Problem hat:
    stackoverflow.com/questions/91…oards-and-low-level-hooks

    Lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    Lösen kann man es, wie bei meinem Testscanner, indem man einen Prefix (Key vor dem Strichocde) und einem Suffix (Key nach dem Strichcode) mitsendet (Scanner kann so konfiguriert werden).
    Wird der Prefix gesendet, kann das der Hook erkennen und den Rest bis zum Suffix auswerten. Falls dies dann einem bestimmtem Schema entspricht kann entschieden werden ob dies nun ein gültiger Strichcode für mein Programm war oder nicht.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten