Announcement

Collapse
No announcement yet.

Im Programm einen Tastendruck (casesensitive) erkennen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Im Programm einen Tastendruck (casesensitive) erkennen

    Hallo Kollegen,

    ich habe ein kleines Problem, welches sich mit der genauen Erkennung der vergangenen Tastendrücke auf der Tastatur befasst.

    Das Problem ist folgendes:
    Wenn ich die Funktion Form_KeyDown verwende, bekomme ich als Übergabe "KeyEventArgs e" angeboten und bei
    Form_KeyPress "KeyPressEventArgs e".

    Nun zu dem Punkt welchen ich aktuell nicht in einem Rutsch zu lösen schaffe:
    - Mit KeyDown erkenne ich alle Tasten (auch F1 z.B.), bekomme diese jedoch immer nur Groß übergeben (z.B. wird ein einfaches "i" zu einem "I").
    **Klar kann ich dies über die Propertey e.Shift abfragen und dann daraus ein var.ToLower machen, setzt mir aber aus einem "F1" ein "p" um :-/

    - Verwende ich nun KeyPress bekomm ich die Buchstaben casesensitive übergeben (das was ich benötige), aber auf "F1" usw wird nicht mehr reagiert...

    Vielleicht kann mir ja jemand von euch eine Lösung nennen, mit der beides geht?

    Und hier zur belustigung mein Code (auf Spaß umgeschrieben):
    [highlight=csharp]

    #region just for fun

    private string _lastKeys = "";
    private readonly Dictionary<string, string[]> _keyChecker = new Dictionary<string, string[]>
    {
    // key code to press, msgbox header, msgbox text or
    // key code to press, switch to function execute, function to execute
    {"iddqd", new[] {"Cheater! :-)", "Godmode activated!"}},
    {"idkfa", new[] {"Cheater! :-)", "All Weapons unlocked!"}},
    {"aAa", new[] {"Testing", "Test!"}},
    {"aaa", new[] {"function", "close"}}
    };

    private void KeyChecker(KeyPressEventArgs e)
    {
    _lastKeys += e.KeyChar;

    foreach (var key in _keyChecker.Keys)
    if (_lastKeys.EndsWith(key))
    {
    if (_keyChecker[key][0] != "function")
    MessageBox.Show(_keyChecker[key][1], _keyChecker[key][0]);
    else
    KeyCheckerFunction(_keyChecker[key][1]);

    _lastKeys = "";
    }

    while (_lastKeys.Length > 100)
    _lastKeys = _lastKeys.Substring(1);
    }

    private void KeyCheckerFunction(string func)
    {
    switch (func)
    {
    case "close":
    Close();
    break;
    }
    }

    private void FormMain_KeyPress(object sender, KeyPressEventArgs e)
    {
    KeyChecker(e);
    }

    #endregion just for fun

    private void FormMain_KeyDown(object sender, KeyEventArgs e)
    {
    if (e.KeyValue == 112)
    {
    Close();
    } // F1
    }
    [/highlight]

  • #2
    F1 und ähnliches wirst du nur in den Up/Down Events bekommen. Die Up/Down Events fangen KeyBoard Tastendrücke KeyPress dagegen stellt nur noch einen char bereit und F1 ist nun mal kein char. Man kann sich jetzt fragen ob beide Arten von Events KeyIrgendwas zu nennen schlau war (man hätte es ja CharPress nennen können) aber jetzt ist es nun mal so.


    ich habe ein kleines Problem, welches sich mit der genauen Erkennung der vergangenen Tastendrücke auf der Tastatur befasst.
    Und so wie du es schreibst das du Tastendrücke der Tastatur verfolgen willst dann ist KeyUp/Down das richtige. Die Tasten wissen ja nichts von ihren multiplen Funktion wie zum Beispiel Groß/Kleinschreibung. e ist e und das es durch Shift, AltGR etc. auf einen anderen Character mappt ist nicht die Schuld der Taste Je nach eingestellten Tastaturlayout wäre ja das Ergebnis auch unterschiedlich.
    Wenn du also mit Tastendrücke wirklich Tastendrücke meinst dann wäre z.B. Shift+i das Ergebnis und niemals I da I schon eine systemabhängige Interpretation wäre.

    Edit: Für die Keys gibt es eine Enumeration also auf 112 zu testen für F1 ist unnötig Keys.F1 ist lesbarer.

    Comment


    • #3
      Originally posted by Ralf Jansen View Post
      Edit: Für die Keys gibt es eine Enumeration also auf 112 zu testen für F1 ist unnötig Keys.F1 ist lesbarer.
      Ist korrekt, hier bekomme ich aber nicht die unterschiede "i" und "I" mit.
      In meinem Beispiel habe ich ja eine Reaktion auf "aaa" und eine auf "aAa" beigeführt.

      Aber für die F1, ... reaktionen habe ich dies abgeändert, danke für den Hinweis!

      Comment


      • #4
        Ist korrekt, hier bekomme ich aber nicht die unterschiede "i" und "I" mit.
        Es sind ja auch Keys und nicht chars i und I ist die gleiche Taste.

        Du kannst aber auch auf KeyData testen was je nachdem was du vorhast einfacher ist.
        Keys ist ein Flags Enum die gedrückte Kombi steckt in KeyData.
        Also z:b.

        Code:
        if ((e.KeyData == (Keys.A | Keys.Shift)))

        Comment


        • #5
          so ziemlich genau war meine erste lösung auch (nur mit auf 112 prüfen ).

          problem war nur, dass ich ja die letzten 100 tastendrücke mit speichern möchte.
          wahrscheinlich stehe ich nur auf dem schlauch und komme gerade nicht auf die passende möglichkeit die shiftabfrage nur auf Chars zu begrenzen.

          Comment


          • #6
            if (e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z)

            is ja auch zu schwer :-/

            Comment


            • #7
              So, bitte Meinung zur aktuellen Umsetzung

              [highlight=csharp]
              #region just for fun

              private string _lastKeys = "";
              private readonly Dictionary<string, string[]> _keyChecker = new Dictionary<string, string[]>
              {
              // key code to press, msgbox header, msgbox text or
              // key code to press, switch to function execute, function to execute
              {"iddqd", new[] {"Cheater! :-)", "Godmode activated!"}},
              {"idkfa", new[] {"Cheater! :-)", "All Weapons unlocked!"}},
              {"aAa", new[] {"Testing", "Test!"}},
              {"aaa", new[] {"function", "close"}}
              };

              private void KeyChecker(KeyEventArgs e)
              {
              _lastKeys += e.Shift
              ? ((char) e.KeyValue).ToString(CultureInfo.InvariantCulture)
              : ((char) e.KeyValue).ToString(CultureInfo.InvariantCulture) .ToLower();

              foreach (var key in _keyChecker.Keys)
              if (_lastKeys.EndsWith(key))
              {
              if (_keyChecker[key][0] != "function")
              MessageBox.Show(_keyChecker[key][1], _keyChecker[key][0]);
              else
              KeyCheckerFunction(_keyChecker[key][1]);

              _lastKeys = "";
              }

              while (_lastKeys.Length > 100)
              _lastKeys = _lastKeys.Substring(1);
              }

              private void KeyCheckerFunction(string func)
              {
              switch (func)
              {
              case "close":
              Close();
              break;
              }
              }

              #endregion just for fun

              private void FormMain_KeyDown(object sender, KeyEventArgs e)
              {
              switch (e.KeyData)
              {
              case Keys.F1:
              MessageBox.Show("F1");
              break;
              case (Keys.F1 | Keys.Shift):
              MessageBox.Show("F1 + Shift");
              break;
              default:
              if (e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z)
              KeyChecker(e);
              break;
              }
              }
              [/highlight]

              Vielen Dank für die Unterstützung Ralf!! Die aktuelle Lösung gefällt mir schon viel besser!

              Comment


              • #8
                Code:
                case (Keys.F1 | Keys.Shift):    MessageBox.Show("F1 + Shift");    break;
                


                Ich kann mir nicht vorstellen, daß das funktioniert
                Günther

                Comment


                • #9
                  Tut es aber

                  Comment


                  • #10
                    Das ist mir neu, man lern nie aus...
                    Günther

                    Comment

                    Working...
                    X