Wie kann ich einen Windows-Hook registrieren?

Heute möchte ich euch zeigen wie man einen Windows-Hook registrieren kann. Erstmal eine kurze Erklärung was ein Hook ist bzw. für was er verwendet wird.

Ein Hook kann verwendet werden um in Windows Systemweit Tastenevents/Mausevents zu registrieren. Für was man das brauchen kann? Zum Beispiel um eine Abwesenheitsanzeige zu realisieren. Ich habe mir z. B. ein kleines Programm geschrieben das meine Tastenanschläge zählt. Über Sinn und zweck kann man sich zwar streiten, allerdings ist das kleine Programm ganz gut für ein Beispiel zu gebrauchen.

Wie immer habe ich für das Projekt den C++ Builder von Embarcadero verwendet.

Als erstes habe ich wieder ein neues Projekt (VCL) erstellt, mit einer leeren Form. In die Header-Datei kommen 2 Variablen:

int m_nCount;
HOOK__* m_myHook

Im Konstruktor des Dialogs initialisiere ich die Count-Variable und registriere den Windows-Hook:

__fastcall TForm8::TForm8(TComponent* Owner)
	: TForm(Owner),
	m_nCount(0)
{
	this->m_myHook = SetWindowsHookExW(WH_KEYBOARD_LL, KeyboardHookProc, NULL, NULL);
	if (this->m_myHook == NULL)
		ShowMessage("Registrieren des Hooks fehlgeschlagen!");
}
//---------------------------------------------------------------------------

Mit SetWindowsHookExW registriere ich wie schon erwähnt den Hook.
Mit WH_KEYBOARD_LL teile ich der Funktion mit, das ich die Tastenevents mitbekommen will.
KeyboardHookProc ist die Callback-Funktion die aufgerufen wird, wenn eine Taste gedrückt wird.
Die letzten beiden Parameter brauchen wir in diesem Fall nicht.

Die Callback-Funktion sieht wie folgt aus:

LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	if (wParam == WM_KEYUP)
	{
		++Form8->nCount;
	}
	else
	{
		return CallNextHookEx(NULL, nCode, wParam, lParam);
	}

	return 0;
}
//---------------------------------------------------------------------------

Wir machen nur etwas falls das WM_KEYUP-Event aufgerufen wird. Diese Information ist im WPARAM-Parameter hinterlegt. In der obigen Funktion erhöhen wir also unseren Zähler um eins, jedes mal wenn eine Taste losgelassen wird. Das ganze funktioniert zwar Systemweit, allerdings nicht bei Vollbildanwendungen (Remotedesktop, Spiele, …).

Am Ende muss der Hook nur wieder deregistriert werden:

__fastcall TForm8::~TForm8()
{
	UnhookWindowsHookEx(this->m_myHook);
}
//---------------------------------------------------------------------------

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.