Bryan Albrecht

Low level keyboard hooks

Jedem, der bereits einmal mit den Standard Keyboard Events von C# gearbeitet hat, wird wissen, dass diese nur funktionieren, wenn das Programm die momentan Benutzte Applikation ist. Sobald ein anderes Programm in den Fokus gerät, werden diese Events nicht mehr unterstützt. Um jedoch trotzdem mit der Tastatur arbeiten zu können, obwohl das Programm nicht im Fokus ist, benötigt man "keyboard hooks".

Nutzen

Keyboard hooks registrieren gepresste Tasten auch, wenn das Programm nicht im Fokus ist. Diese können dann mit einem Event ans Programm weitergegeben werden. Eine der bekanntesten Anwendungsfälle, bei welchem alle Tastatureingaben "mitgehört" werden, ist ein Keylogger. Ein Keylogger hört auf alle Eingaben und schreibt diese mit.

NuGet package

Damit die Logik fürs abfangen der Tastatur Eingaben nicht selbst geschrieben werden muss, gibt es bereits Libraries, welche diese Funktion beherrschen. In diesem Beispiel wird globalmousekeyhook verwendet.

Um die Library verwenden zu können, muss diese zuerst installiert werden:

  1. nuget install MouseKeyHook

Implementierung

Das Implementieren ist durch das verwenden der Library sehr einfach.

Als erstes muss eine Variable vom Typ erstellt werden. Dies sieht wie folgt aus:

  1. private IKeyboardMouseEvents m_GlobalHook;

Diese Variable muss beim Laden der Applikation zugewiesen werden:

  1. m_GlobalHook = Hook.GlobalEvents();

Das zugewiesene Objekt besitzt verschiedene Events. In diesem Artikel wird mit dem KeyPress Event gearbeitet. Damit registriert wird, wenn eine Taste gedrückt wird, muss dem Event ein Eventhandler zugewiesen werden:

  1. m_GlobalHook.KeyPress += M_GlobalHook_KeyPress;
  2. private void M_GlobalHook_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
  3. {
  4. }

Im Eventhandler kann nun auf das mitgegebene Argument zugegriffen werden. Dieses beinhaltet den gedrückten Charakter:

  1. e.KeyChar

Resultat

Die nun implementierten keyboard hooks rufen nun den Event auf, auch wenn das Programm nicht im Fokus ist.