Sonntag, 4. Juli 2010

Tastatureingaben auf das Formular umleiten / Tastenvorschau

Angenommen, ihr möchtet verschiedene Tastenkombinationen global im Formular definieren. Zum Beispiel soll das Programm beim Druck auf die Esc - Taste beendet werden oder über "Strg + F" eine Suchfunktion aufgerufen werden.
Auf dem Formular befinden sich aber wahrscheinlich Steuerelemente wie Textboxen o.ä., die dem Formular den Fokus "wegnehmen". Drückt der Benutzer "Esc" und ist momentan ein anderes Steuerelement ausgewählt, wird die Tastendruckbehandlung dieses Steuerelements aufgerufen und nicht die des Formulars, wo der entsprechende Code zum Beenden des Programms steht.
Eine Möglichkeit wäre nun, alle Tastaturereignisse in eine Funktion umzuleiten, doch so wären steuerelementspezifische Ereignisse schwierig zu behandeln.
Glücklicherweise lässt sich dieses Problem ganz leicht in C# lösen, wir müssen einfach die Eigenschaft KeyPreview des Formulars auf true setzen. Jetzt werden alle Tastendrücke auch dem Formular gemeldet.
Dem Formular werden die Tastendrücke jedoch nur mitgeteilt, wenn es aktiv ist, Tastendrücke in anderen Anwendungen werden nicht eingefangen.
Diese Funktion zu realisieren ist wesentlich schwieriger, hierfür braucht man globale Tastaturhooks, die tief auf Systemebene in die Nachrichtenstruktur eingreifen und Ereignisse an das Formular weiterleiten.

Kommentare:

  1. als Weiterführung ein gutes Beispiel mit Demo Projekt und source code für Global Hooks
    http://www.codeproject.com/KB/system/globalsystemhook.aspx

    AntwortenLöschen
  2. Funktioniert aber nicht, wenn man z. B. ein ActiveX-Control eingebunden hat, dass auch Tastendrücke auswertet (z. B. Acrobat Reader Control). Wie macht man es hier?

    AntwortenLöschen