Hook funktioniert nicht



  • @rT!f@Ct schrieb:

    also erstmal denke ich das du nicht ganz verstanden hast wozu so ein keyhook gut ist.

    möglich. vielleicht verwechsel ich auch grad was.

    was willst du mit dem keyhook in deinem programm? da ist er doch sinlos. in deinem programm kannst du tastaturnachrichten mit DEINER WindowProcedure abfangen.
    einen Keyhook schleust man in ein fremdes programm ein, wenn man wissen will welche taste dort getrückt wurde.

    Im prinzip will ich folgendes:
    wenn der benutzer irgendwann, irgendwo(in irgendeinem programm) irgendeine taste drückt, etwas machen. Z.b. sobald man F10 drückt schaltet sich der computer aus.

    und "ba" steht bei dir weil du in deiner WinMain die Funktion
    SetupHook (HWND hParent)
    aufrufst und direckt danach
    std::cout << "a";

    wieso "ba" ausgegebn wird weiß ich, aber wieso niemls "c" ausgegeben wird weiß ich nicht.

    /*******************************************************************/
    /* KeyboardHookProc: wird jedes mal aufgerufen, wenn eine Taste betätigt wird */

    Das heißt für mich, dass ich entweder keine taste gedrückt habe, oder das irgend ein fehler im programm ist.

    Achja, das gepostete programm ist natürlich noch sinnlos, aber erst sollte es prinzipiell funktionieren, dann baue ich die echten funktionen ein.

    Mfg



  • wenn der benutzer irgendwann, irgendwo(in irgendeinem programm) irgendeine taste drückt, etwas machen. Z.b. sobald man F10 drückt schaltet sich der computer aus

    dann solltest du den hook systemweit installieren und nicht in deinem programm.
    kann nämlich gut möglich sein, das genau aus diesem grund (in deinem prog) der hook nicht funzt.

    ich habe vor etwas längere zeit das gleiche beispiel genutzt wie du und bei mir hat es geklappt.

    auch solltest du in der Main.cpp folgendes definieren

    typedef BOOL (*SetupHookDll)(HWND); 
    typedef BOOL (*UninstallHookDll)(void);
    
    SetupHookDll 	m_pSetupHookDll	= NULL;	
    UninstallHookDll	m_pUninstallHookDll  = NULL;
    

    in einer Funktion von der aus du den Hook inizialisieren willst sollte folgendes stehen.

    HMODULE hMyDll = NULL; 
    
    hMyDll = LoadLibrary("C:\\PfadZuDerHookDll\\KeyHook.dll"); 
    if(hMyDll == NULL) 
    { 
        MessageBox(0,"Dll nicht gefunden!\n","",IDOK); 
        return; 
    } 
    
    m_pSetupHookDll = (SetupHookDll)GetProcAddress(hMyDll, "SetupHook"); 
    
    if(m_pSetupHookDll == NULL) 
    { 
        MessageBox(0,"SetupHookDll Funktionen nicht gefunden!\n","",IDOK);   
        return; 
    } 
    
    m_pSetupHookDll(hWnd);
    


  • quark der code da oben funzt genauso gut. aber wenn du keine ahnung von der arbeitsweise von hooks hast, solltest du sie auch nicht verwenden. immer das gleiche hier, echt man. die hook callback wird im kontext des jeweiligen prozesses aufgerufen, d.h. die hook.dll wird in den prozess eingeblendet. mach dir das bitte klar und lies mal die msdn durch, glaubste bill gates und steve balmer haben das alles zum spaß da aufgeschrieben, damit es keiner liest?? 👎



  • ascda schrieb:

    quark

    Japp. Er verwendet einfach nur den falschen Hook.
    Ich würde den da:

    WH_KEYBOARD_LL

    LL = Low Level

    verwenden, wobei die Hook-Prozedur in einer DLL liegen sollte. Nach M-Schrott darf sie auch Applications-Scope haben.



  • WH_KEYBOARD_LL ist ned global hook



  • ascda schrieb:

    WH_KEYBOARD_LL ist ned global hook

    Dann hat sich M-Schrott wohl geirrt:

    Hook Scope
    WH_CALLWNDPROC Thread or global
    WH_CALLWNDPROCRET Thread or global
    WH_CBT Thread or global
    WH_DEBUG Thread or global
    WH_FOREGROUNDIDLE Thread or global
    WH_GETMESSAGE Thread or global
    WH_JOURNALPLAYBACK Global only
    WH_JOURNALRECORD Global only
    WH_KEYBOARD Thread or global
    WH_KEYBOARD_LL Global only << hier ....
    WH_MOUSE Thread or global
    WH_MOUSE_LL Global only
    WH_MSGFILTER Thread or global
    WH_SHELL Thread or global
    WH_SYSMSGFILTER Global only

    Wir schreiben einen Brief nach Redmond.



  • However, the WH_KEYBOARD_LL hook is not injected into another process. Instead, the context switches back to the process that installed the hook and it is called in its original context. Then the context switches back to the application that generated the event.


  • Mod

    ascda schrieb:

    However, the WH_KEYBOARD_LL hook is not injected into another process. Instead, the context switches back to the process that installed the hook and it is called in its original context. Then the context switches back to the application that generated the event.

    Selbst wenn der Low Level Keyboard Hook nicht injeziert wird, ist er dennoch ein globaler Hook!



  • Hi,

    danke erstmal die die vielen Antworten.
    Ich hab jetzt einiges rumprobiert und auch den Code von @rT!f@Ct eingebaut. Es kommt die Meldung, dass er die Funktion "SetupHook" nicht findet. Die Dll findet er aber, was die vermutung nahelegt, dass das problem an der Dll, bzw. der Verwendung der dll liegt.

    Und wenn ich Zeile 46:

    hhkHook = SetWindowsHookEx (WH_KEYBOARD, KeyboardHookProc, hDllInstance, NULL) ;
    

    durch

    hhkHook = SetWindowsHookEx (WH_KEYBOARD, KeyboardHookProc, NULL, GetCurrentThreadId()) ;
    

    ersetzte, werden TastaturEvents registriert(Ausgabe von "c"), solange der Focus bei meiner eigenen Form ist, sonst nicht(mit WH_KEYBOARD_LL geht es gar nicht)

    Mfg



  • ich denke das dein fehler in der deklaration der Funktionen UninstallHook & SetupHook liegt

    UninstallHook & SetupHook sind KEINE Callback funktionen ändere mal die deklaration der beiden funktionen in der header & quellcode datei der DLL wie folgt ab

    *.h

    EXPORT BOOL  UninstallHook (void);
    EXPORT BOOL  SetupHook (HWND hParent);
    

    *.cpp

    EXPORT BOOL  UninstallHook (void)
    {
    	//.....
    }
    EXPORT BOOL  SetupHook (HWND hParent)
    {
    	//......
    }
    


  • Hi,

    VIELEN DANK 👍

    Das EXPORT war die entscheidende Stelle. Jetzt funktioniert er prima.
    👍
    Danke für die viele Arbeit, die ihr da reingesteckt habt

    Mfg DerBaer


Anmelden zum Antworten