Unter .NET bzw. Windows Forms gibt es für das Abfragen von Tasten die Events KeyDown, KeyUp und KeyPress, welche am Formular hängen bzw. an den Controls. In meinem Fall hängen sie an einem Formular bei welchem die KeyPreview Eigenschaft auf true gesetzt ist.
Mit diesen Events kann man problemlos fast alle Tasten abfangen. Problematisch wird es aber bei den Cursortasten. Hier bekomme ich nur ein KeyUp Event. Nun gibt es eine Möglichkeit diese Tasten trotzdem abzufragen in dem die Funktion ProcessCmdKey überladen wird:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { bool shift=(keyData&Keys.Shift)!=0; bool control=(keyData&Keys.Control)!=0; bool alt=(keyData&Keys.Alt)!=0; Keys unmodifiedKey=(keyData&Keys.KeyCode); if(unmodifiedKey==Keys.Up) DoFoobar(unmodifiedKey); return base.ProcessCmdKey(ref msg, keyData); }
Allerdings funktionierte diese Methode nicht wie gewünscht. Eine andere Methode ist die Überladung der Funktion IsInputKey. Dort wird dann festgelegt das die Cursortasten wie normale Eingabetasten behandelt werden. Allerdings brachte es nichts, diese Funktion im Hauptformular zu überladen, da sie dort nie erreicht wurde. Deshalb wurde sie in dem im Formular befindlichen OpenGL Control überladen:
protected override bool IsInputKey(System.Windows.Forms.Keys keyData) { if((keyData&Keys.KeyCode)==Keys.Up) return true; if((keyData&Keys.KeyCode)==Keys.Right) return true; if((keyData&Keys.KeyCode)==Keys.Left) return true; if((keyData&Keys.KeyCode)==Keys.Down) return true; return base.IsInputKey(keyData); }
Damit kamen die Events für die Cursortasten ganz normal bei den entsprechenden Events des Hauptformulares an.
Weitere Informationen gibt es unter:
http://stackoverflow.com/questions/2434834/processcmdkey-wait-for-keyup
http://familie-ottenhaus.de/simon/blog/2009/12/csharp-eigenes-control-keys-up-down-left-right-onkeydown-onkeypress-vs-processcmdkey/