[C#] Tastaturstatus vergleichen - Tasten (KeyState) vergleichen

Drucken
( 1 Vote )
Hauptkategorie: Programmieren Kategorie: C#
Erstellt am 19.03.2012 Zuletzt aktualisiert am 19.03.2012 Geschrieben von Jonny132
Abzufragen ob eine bestimmte Taste gedrückt ist, ist nicht schwer. Dazu kann man das KeyDown Event eines Controls / einer Form (eventuell mit .KeyPreview = true) abbonieren und den CeyCode abfragen.
Will man jedoch Tastenkombinationen abfragen ist man schnell an der Grenze der Events angelangt. Zwar kann man Kombinationen mit der Steuerungs -und ALT Taste mittels logischer Bit-Verknüpfung abfragen jedoch keine Kombinationen 'normaler' Tasten wie zB die Taste 'A' + 'S'.

Einzelne Taste abfragen:
if (e.KeyData == Keys.A)
{
  MessageBox.Show("Taste A wurde gedrückt");
}
Tastenkombination mit STRG und ALT abfragen:
if (e.KeyData == (Keys.Control | Keys.Alt | Keys.A))
{
  MessageBox.Show("Tasten STRG + ALT + A gleichzeitig gedrückt");
}
Versucht man diesen Block beispielsweise mit den Keys 'A' + 'S', dann wird die MessageBox bei jedem druck auf die Taste 'S' angezeigt.
Um solche Kombinationen abzufragen, erstellt nun bitte eine neue Windows Forms Anwendung auf dessen Form ihr 2 Buttons und 1 Label zieht. Nun abboniert noch das Click-Event des jeweiligen Buttons und das KeyDown und KeyUp Event der Form und wechselt in die Codeansicht. Um die Status der Tastatur zu speichern, verwenden wir 2 Globale Listen die die gedrückten Keys beinhalten:
List<Keys> currentKeys = new List<Keys>();
List<Keys> keysToMatch = new List<Keys>();
KeyDown Ereignis der Form:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
  if(!currentKeys.Contains(e.KeyCode))
    currentKeys.Add(e.KeyCode);
}
Hier fügen wir die jeweils gedrückte Taste (falls noch nicht vorhanden) in die Liste currentKeys ein.

KeyUp Ereignis der Form:
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
  currentKeys.Remove(e.KeyCode);
}
In diesem Event löschen wir den Key wieder aus der Liste raus, somit haben wir immer den aktuellen Stand der gedrückten Tasten in dieser Liste.

Click - Event des ersten Buttons:
    private void button1_Click(object sender, EventArgs e)
    {
      keysToMatch.Clear();
      keysToMatch.AddRange(currentKeys.ToArray());
      label1.Text = "Tastaturstatus wird auf (";
      foreach (Keys key in keysToMatch)
      {
        label1.Text += key.ToString() + ", ";
      }
      label1.Text = label1.Text.Substring(0, label1.Text.Length - 2) + ") gesetzt";
    }
Hier löschen wir zuerst alle Einträge aus der Liste die zu vergleichen ist und fügen ihr dann alle Werte zu die im späteren Verlauf überprüft werden soll. In der Liste keysToMatch befindet sich zu diesem Zeitpunkt dann der Tastaturstatus der verglichen werden soll. Zusätzlich geben wir den Aktuellen Tataturstatus im Label aus.

Click - Event des zweiten Buttons:
    private void button2_Click(object sender, EventArgs e)
    {
      if (MatchKeyStates(currentKeys, keysToMatch))
        label1.Text = "Die Tastaturstatus passen zusammen";
      else
        label1.Text = "Die Tastaturstatus passen NICHT zusammen";
    }
Hier überprüfen wir ob die 2 Listen die gleichen Inhalte (=Keys) haben mittels einer Hilfsfunktion. Sind sie gleich, wird eine Erfolgsmeldung im Label ausgegeben, ansonsten eine Fehlermeldung.

Hilfsfunktion MatchKeyStates:
    private bool MatchKeyStates(List<Keys> list1, List<Keys> list2)
    {
      if (list1.Count == list2.Count)
      {
        foreach (Keys key in list1)
        {
          if (!list2.Contains(key))
            return false;
        }
        return true;
      }
      else
      {
        return false;
      }
    }
Diese Hilfsfunktion nimmt 2 Listen die Keys beinhalten als Parameter entgegen und gibt als Ergebnis einen Boolischen Wert zurück. True bei gleichheit, False bei unterschieden. Starten Sie das Projekt und drücken Sie gleichzeitig die zu Vergleichenden Tasten. Zeitgleich drücken sie mit der Maus den Button1 damit der Status zwischengespeichert wird. Versuchen Sie nun unterschiedliche Tastaturvariationen aus und drücken zeitleich Button2. Werden die gleichen Tasten gedrückt die zuvor zwischengepseichert wurde, wird eine Erfolgsmeldung dargestellt.





    Veröffentlichen Sie ihre Kommentare ...