Cursortasten auf einem Form abfragen

Die Eigenschaften OnKeyDown und OnKeyUp werden von einem System.Windows.Form.Form zwar angeboten, aber leider ignoriert. Im Ergebnis bedeutet dies, dass man keine Tastatureingaben auf einem Form empfangen kann - jedenfalls nicht so einfach, wie man es erwartet. Das Problem lies sich leider auch nicht dadurch erledigen, dass ich ein Panel über dem Form ausbreitete. Das Panel bietet die Funktionen wenigstens nicht an, so dass es wenigstens nicht verwundert, wenn die Funktion ignoriert wird.

Nun gibt es zum ersten die Möglichkeit ProcessDialogChar zu überschreiben.

protected override bool ProcessDialogChar(char charCode)
{
  return base.ProcessDialogChar(charCode);
}

Hier erhält man das Zeichen, der gedrücken Taste. Das eigent sich bereits, um Sonderzeichen, wie die Escape-Taste abzufangen, doch leider haben die Cursor-Tasten kein durckbares Zeichen.

Um die Cursortaste zu erhalten, muss man ProcessDialogChar in einer anderen Überladung überschreiben:

protected override bool ProcessDialogKey(Keys keyData)
{
  if( keyData == Keys.Down )
    MessageBox.Show("ProcessCmdKey - OnKeyDown");
 
  return base.ProcessDialogKey(keyData);
}

Als zweite Möglichkeit kann ProcessCmdKey überschrieben werden:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
  if( keyData == Keys.Down )
    MessageBox.Show("ProcessCmdKey - OnKeyDown");
 
  return base.ProcessCmdKey(ref msg, keyData);
}

Cursortasten im UserControl

Vergleichbar ist es mit dem UserControl, auch hier werden OnKeyDown und OnKeyPress nicht mit dem Ereignis der Cursortaste versorgt und auch hier lautet die Lösung ProcessCmdKey.

Steuerungstasten bei ProcessCmdKey

In keyData sind auch Alt, Shift und Strg kodiert. keyData == Keys.Up ist nur dann true, wenn keine Steuerungstaste gleichzeitig gedrückt wurde.

Welche Tasten gedrückt sind lässt sich folgendermaßen herausfinden:

bool shift = (keyData & Keys.Shift) != 0;
bool control = (keyData & Keys.Control) != 0;
bool alt = (keyData & Keys.Alt) != 0;
Keys keyCode = (keyData & Keys.KeyCode);