c# – eigenes Control, Keys.Up, Down, Left, Right: OnKeyDown / OnKeyPress vs. ProcessCmdKey
Wer ein eigenes Control (Steuerelement) in c# erstellt und dachte, dass er mit OnKeyDown Pfeiltasten erkennen kann ist auf dem Holzweg:
View Code CSHARP
1 2 3 4 5 6 | protected override void OnKeyDown(KeyEventArgs e) { /* wird für Pfeiltasten nicht aufgerufen */ base.OnKeyDown(e); if (e.KeyCode == Keys.Up) MoveIndex(-1); } |
Bei Druck auf die Pfeiltasten (Keys.Up, Keys.Down, Keys.Left, Keys.Right) wird weder OnKeyDown noch OnKeyPress aufgerufen.
Die Lösung bringt ProcessCmdKey:
View Code CSHARP
1 2 3 4 5 6 | protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == Keys.Up) MoveIndex(-1); return base.ProcessCmdKey(ref msg, keyData); } |
Hier muss allerdings beachtet werden, dass in keyData auch Strg, Shift und Alt kodiert werden. keyData == Keys.Up ist nur true, wenn keine Steuerungstaste (Strg, Shift, Alt) gleichzeitig gedrückt wurde.
Welche Tasten gedrückt sind lässt sich folgendermaßen herausfinden:
View Code CSHARP
1 2 3 4 | bool shift = (keyData & Keys.Shift) != 0; bool control = (keyData & Keys.Control) != 0; bool alt = (keyData & Keys.Alt) != 0; Keys unmodifiedKey = (keyData & Keys.KeyCode); |