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); }
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
.
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);