an hook'er



  • hi al zsamn,

    folgender code funzt sehr gut, aber nur dann wenn mein progarmm activ ist..... an sonsten (inactiv) bekommt mein fenster keine nachricht "WM_MY".....!
    Ist das normal? oder habe ich was wergessen...

    zur erklaerung:
    die dll.dll soll alle WM_KEYDOWN und WM_KEYUP nachrichten abfangen und sie an mein programm senden...

    ///////////////////////////////////////////
    
    // exe.cpp
    
    #include "dll.h"
    
    #define WM_MY (WM_USER + 1)
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
        switch (message){
            case WM_CREATE :
                // dll-funkition aufrufen und HANDLE auf mein programm uebergeben
                SetupHook (hwnd) ;
                return 0 ;
            case WM_MY :
                MessageBox (NULL, "Angekommen", "Nachricht", NULL) ;
                return 0 ;
            case WM_DESTROY :
                UninstallHook () ;
                PostQuitMessage (0) ;
                return 0 ;
        }
        return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    
    ////////////////////////////////////////////
    
    //dll.h
    
    #ifdef __cplusplus
    #define EXPORT extern "C" __declspec (dllexport)
    #else
    #define EXPORT __declspec (dllexport)
    #endif
    
    EXPORT BOOL CALLBACK SetupHook (HWND) ;
    EXPORT BOOL CALLBACK UninstallHook (void) ;
    
    /////////////////////////////////////////////
    
    // dll.cpp
    
    #include <windows.h>
    #include "dll.h"
    
    #define WM_MYWM (WM_USER + 1)
    
    LRESULT CALLBACK KeyboardHookProc (int, WPARAM, LPARAM) ;
    
    HINSTANCE   hDllInstance ;
    HHOOK       hhkHook ;
    HWND        hParentWindow ;
    
    int APIENTRY DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved){
        hDllInstance = hInstance ;
        return TRUE ;
    }
    
    // Diese funktion wird von meinem programm aus (exe.cpp) aufgerufen
    // Epfangene Parameter HANDLE auf mein fenster (exe.cpp)
    
    EXPORT BOOL CALLBACK SetupHook (HWND hWindow){
        // Hook auf die Tastatur setzen
        hhkHook = SetWindowsHookEx (WH_KEYBOARD, KeyboardHookProc, hDllInstance, NULL) ;
        hParentWindow = hWindow ;
        return TRUE ;
    }
    
    // Tastatur auf diese funktion verbogen
    
    LRESULT CALLBACK KeyboardHookProc (int nCode, WPARAM wParam, LPARAM lParam){
        int iVK_USER ;
    
        // F1 bis F12 abfangen
        switch (wParam){
            case VK_F1 :
                iVK_USER = VK_F1 ;
                break ;
            case VK_F2 :
                iVK_USER = VK_F2 ;
                break ;
            case VK_F3 :
                iVK_USER = VK_F3 ;
                break ;
            case VK_F4 :
                iVK_USER = VK_F4 ;
                break ;
            case VK_F5 :
                iVK_USER = VK_F5 ;
                break ;
            case VK_F6 :
                iVK_USER = VK_F6 ;
                break ;
            case VK_F7 :
                iVK_USER = VK_F7 ;
                break ;
            case VK_F8 :
                iVK_USER = VK_F8 ;
                break ;
            case VK_F9 :
                iVK_USER = VK_F9 ;
                break ;
            case VK_F10 :
                iVK_USER = VK_F10 ;
                break ;
            case VK_F11 :
                iVK_USER = VK_F11 ;
                break ;
            case VK_F12 :
                iVK_USER = VK_F12 ;
                break ;
            default :
                iVK_USER = 0 ;
                break ;
        }
        if (iVK_USER != 0){
            // Nachricht an mein programm (exe.cpp) senden
            SendMessage (hParentWindow, (UINT) WM_MYWM, (WPARAM) iVK_USER, (LPARAM) 1) ;
        }
        return CallNextHookEx (hhkHook, nCode, wParam, lParam) ;
    }
    
    // Hook deinstallieren
    EXPORT BOOL CALLBACK UninstallHook (void){
        UnhookWindowsHookEx (hhkHook) ;
        return TRUE ;
    }
    

    ich hoffe der code ist lesbar und verstaendlich geschrieben.
    fuer jede hilfe bin ich dankbar...

    thx

    mfg
    toom



  • hat sich erledigt.

    es lag an der gemeinsamen nutzung der Datensegmente...



  • winuser.h:

    #define VK_F1   0x70
    #define VK_F2   0x71
    #define VK_F3   0x72
    #define VK_F4   0x73
    #define VK_F5   0x74
    #define VK_F6   0x75
    #define VK_F7   0x76
    #define VK_F8   0x77
    #define VK_F9   0x78
    #define VK_F10  0x79
    #define VK_F11  0x7A
    #define VK_F12  0x7B
    #define VK_F13  0x7C
    #define VK_F14  0x7D
    #define VK_F15  0x7E
    #define VK_F16  0x7F
    #define VK_F17  0x80
    #define VK_F18  0x81
    #define VK_F19  0x82
    #define VK_F20  0x83
    #define VK_F21  0x84
    #define VK_F22  0x85
    #define VK_F23  0x86
    #define VK_F24  0x87
    

    Warum machst du das sooo kompliziert???
    😮 😮

    cu para
    :o



  • ?



  • Na du könntest es doch so machen:

    if(wParam>=0x70 && wParam<=0x87)
    iVK_USER = wParam;
    else
    iVK_USER = 0;
    

    cu para
    😃

    [ Dieser Beitrag wurde am 08.01.2003 um 18:27 Uhr von paranoiac.org editiert. ]



  • logisch.... aber noch besser ist:::

    if ((wParam >= VK_F1) && (wParam <=VK_F12))
        SendMessage (hParentWindow, (UINT) WM_KEYDOWN, (WPARAM) wParam, (LPARAM) lParam) ;
    

    kuerzer geht's nicht...

    amen


Log in to reply