KeyboardHook
-
hi, ich hoffe der Code ist gut verständlich...
// hookdll.h #ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif // Funktonalität sowohl unter C als auch unter C++ gegeben EXPORT BOOL CALLBACK SetupHook (HWND) ; EXPORT BOOL CALLBACK UninstallHook (void) ; // Die Prototypen der EXPORT Funktionen ///////////////////////////////////////////////////////////// // hookdll.c // Der Keyboardhook wird beim aufruf die Funktion SetupHook (HWND) // vom Hauptprogramm aus gesetzt. Dabei wird das Fensterhandle des // aufrufendes Programms an die Funktion übergeben. Als Ergebnis // sendet die hookdll.dll über die Funktion KeyboardHookProc // jedes mal wenn eine Taste betätigt wird eine Nachricht // vom Typ (WM_USER + 2) an das Hauptprogramm. Dabaei steht der // Tastencode der gedrückten Taste in dem Paramter "wParam". // Wenn der Hook nicht mehr benötigt wird, löscht man ihn über die // Funkion UninstallHook () #include <windows.h> #include "hookdll.h" /* -> Siehe Oben */ // Weise den Compiler an, die Variable hWindow in einem // separaten Abschnitt namens Shared unterzubringen // Darüber hinaus ist dann auch noch dem Linker mitzuteilen, // dass die Daten in diesem Abschnitt von allen Instanzen // dieser Anwendung gemeinsam verwendet werden sollen. // Ganz wichtig dabei ist, dass die Variablen initialisiert // sein müssen. #pragma data_seg ("Shared") HWND hWindow = 0 ; #pragma data_seg () // Weise den Compilern, den Abschnitt Shared als lesbar, // beschreibbar und zur gemeinsamen Verwendung zu deklarieren - "RSW". #pragma comment (linker, "/section:Shared,RWS") LRESULT CALLBACK KeyboardHookProc (int, WPARAM, LPARAM) ; // Der Prototyp der Funktion KeyboardHookProc HHOOK hhkHook ; HINSTANCE hDllInstance ; // Definition globaler Variablen /************************************************************************/ /* DllMain: wird automatisch aufgerufen, wenn die DLL mit LoadLibrary() */ /* geladen, oder mit FreeLibrary wieder freigegeben wird. */ /* Eingabe Parameter: Systemspezifische Daten */ /* Return-Wert: TRUE */ /************************************************************************/ int APIENTRY DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved){ switch (fdwReason){ case DLL_PROCESS_ATTACH : // Die DLL wird in den Adressraum des aktuellen Prozesses // eingeblendet. hDllInstance = hInstance ; // Initialisierung der globalen Variable break ; } return TRUE ; } /***********************************************************/ /* SetupHook: EXPORT Funktion, setzt den Keyboardhook */ /* Eingabe Parameter: HWND des aufrufenden Fensters */ /* Return-Wert: TRUE */ /***********************************************************/ EXPORT BOOL CALLBACK SetupHook (HWND hParent){ hWindow = hParent ; // Initialisierung der globalen Variable mit dem Eingabe Parameter hhkHook = SetWindowsHookEx (WH_KEYBOARD, KeyboardHookProc, hDllInstance, NULL) ; // Keyboardhook setzen und das Ergebnis in der globalen Variable // hhkHook speichern. return TRUE ; } /*******************************************************************/ /* KeyboardHookProc: wird jedes mal aufgerufen, wenn eine Taste */ /* betätigt wird */ /* Eingabe Parameter: Systemspezifische Daten */ /* Return-Wert: s. u. */ /*******************************************************************/ LRESULT CALLBACK KeyboardHookProc (int nCode, WPARAM wParam, LPARAM lParam){ if (nCode == HC_ACTION){ // Verhindern das eine Nachricht mehrmals verarbeitet wird. if ((lParam & 1073741824) != 1073741824){ // Überprüfen ab vor dem Aufruf dieser Funktion die Taste bereits gedrückt war SendMessage ((HWND) hWindow, (WM_USER + 2), (WPARAM) wParam, (LPARAM) lParam) ; // Senden der Nachricht (WM_USER + 2) und den Tastencode der gedrückten // Taste (gespeichert in "wParam") an das in der globalen Variable // hWindow gespeicherte Fensterhandle. } } return CallNextHookEx (hhkHook, nCode, wParam, lParam) ; // Die Nachrichten an den nächsten Hook weiterreichen. } /*********************************************************************/ /* UninstalHook: EXPORT Funktion, löscht den über die Funktion */ /* SetupHook gesetzten Hook */ /* Eingabe Parameter: keine */ /* Return-Wert: TRUE */ /*********************************************************************/ EXPORT BOOL CALLBACK UninstallHook (void){ UnhookWindowsHookEx (hhkHook) ; // den in der globalen Variable hhkHook gespeicherten Hook löschen. return TRUE ; } /////////////////////////////////////////////////////////////////////