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 ;
    }
    
    /////////////////////////////////////////////////////////////////////
    

Anmelden zum Antworten