Hooks



  • Hey Leute,

    hab mir gerade paar Tuts über Hooks in C++ angeschaut ( hauptsächlich das FAQ hier, den Beitrag von Ernsti).

    Ich blicke aber noch nicht so wirklich dahinter ...

    HHOOK hMyMouseHook = SetWindowsHookEx(WH_MOUSE,MouseProc,hInstance,NULL);
    

    So würde man einen Mouse-Hook installieren ?
    Zu MouseProc :
    MSDN : If nCode is less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and should return the value returned by CallNextHookEx.
    Soll das das bedeuten ? :

    LRESULT MouseProc(int nCode,WPARAM wParam,LPARAM lParam) {
    if(nCode <0 ) 
    hMyMouseHook=CallNextHookEx(nCode,lParam,wParam);
    return hMyMouseHook; //should return the value returned by CallNextHookEx.
    if(nCode==HC_ACTION) // oder HC_NOREMOVE
    //dann stehen die Infos in wParam und lParam und man kann
    //was damit machen, right?
    
    return 0; // Falsch, aber keine Ahung was o.0
    }
    

    Generell verstehe ich nicht, was wieso in einer DLL gecoded werden muss.
    Noch was : MSDN spricht immer von einer Hook-Chain ? Meinen die einfach den Fall, dass man

    SetWindowsHookEx
    

    mehrmals mit verschiedenen Hook-Typen verwendet hat ?

    Hoffe ich konnte meine Fragen verständnisvoll formulieren 😛

    Mfg



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Das kann so nicht gehen, if(nCode==HC_ACTION) wird nie erreicht. Außerdem empfiehlt es sich als return am Ende einfach CallNextHookEx zu machen und einfach nur das auszuwerten was nCode>0 ist. Also kannst du dir die Abfrage nach kleiner und den return in der Mitte komplett sparen und bist dir sicher, dass andere Programme den Mausbefehl auch empfangen.



  • Hook Chain bedeutet einfach, dass man mehrere Hooks installieren kann, die auf das gleiche Event unterschiedlich reagiren können. Möglicherweise bist du nicht der Einzige, der einen Mousehook installiert. Deswegen solltest du in deinem Handler auch immer den nächsten Hook per CallNextHook aufrufen. Wenn nCode kleiner als 0 ist solltest du direkt CallNextHook aufrufen, ohne selbst irgendetwas zu machen. Der erste Parameter wird ab Windows NT nicht mehr ausgewertet und darf daher NULL sein. Um sicherzugehen kannst du aber dein Hook Handle übergeben, das sollte dann immer funktionieren.

    RESULT MouseProc(int nCode,WPARAM wParam,LPARAM lParam) 
    {
       if( nCode >= 0 )
       {
          // eigener Code
          ...
       }
       return CallNextHookEx( NULL, nCode, wParam, lParam );
    }
    

    Dass der Hook Code in einer DLL liegen muss hat den Grund, dass der Hook systemweit installiert wird und daher nicht im User space eines bestimmten Prozesses liegen darf. Eine DLL kann von jedem Prozess geladen werden, damit steht der Hook Code jedem Prozess zur Verfügung. Überlicherweise bietet der Hook Code noch eine Schnittstelle, mit der er mit dem Client Code kommunizieren kann (da in der DLL der Kontext fehlt).



  • Ahh oke 🙂 Danke schonmal so weit, bis jetzt dachte ich, wenn nCode > 0 ist, wird es dringend empfohlen auch CallNextHookEx() zu returnen.

    Noch eine dumme Frage : ( Die muss es auch geben 😛 )
    Für wen ist denn der return-Wert von MouseProc() überhaupt relevant ?
    Die einzige FUnktion die damit irgendwas am Hut hat ist ja wohl SetWindowsHookEx().



  • Der Returnwert von Mouseproc ist für ALLE ANDEREN Programme interessant. Wenn du ihn nicht weitergibst dann schluckt dein Programm quasi die Eingaben des Benutzers und andere Programme können nicht mehr auf ein Klicken z.b. reagieren.



  • Oh, das wäre natürlich fatal. Thx 😛

    Eine Frage noch : Was macht Hooks so "gefährlich" ? In manchen Tuts wird darauf hingewiesen, dass nur erfahrene Programmierer damit rum-hantieren sollten.

    Solang man den Hook in seinem Programm wieder schön löscht und - wie von euch bereits erwähnt - die return-Werte beachtet, sollte doch eigentlich nichts passieren ? Nur ziemlich langsam macht es den Rechner wohl während der Hook läuft, oder ?

    Mfg



  • Ganz einfach man kann,

    A: Verhindern, dass andere Programme richtig funktionieren. (fehlerhafte Programmierung
    B: Sämtliche Benutzereingaben (passwörter etc.) mitschreiben. (Keylogger/Schadsoftware)

    Beide Fälle sind unschön.



  • Stimmt. Sollte man wohl aufpassen und genau nachdenken beim Coden ^^

    Ihr hattet gesagt, dass der Code ( der gesamte ? ) in einer DLL geschrieben wird, damit man systemweite Hooks bekommt. Muss man nicht dazu noch in der DLL ein shared Datenelement einrichten?



  • Ja und zwar etwa so ...

    #pragma data_seg("shared")
    HINSTANCE hinstanc = 0;
    ...
    ...
    #pragma data_seg()
    
    #pragma comment(linker, "/Section:shared,rws")
    


  • Okay, das wäre so für VC ^^ Trotzdem danke.
    Ich habe eine kleine Hook-Prozedur in Begleitung von disem Tutorial geprogged : http://www.tutorials.de/c-c-tutorials/164662-tutorial-ueber-windows-hooks.html Funzt aber nicht wirklich .. vllt. finde ich meine Fehler iwie . Guten Abend noch

    Edit: Nice, hab den Fehler gefunden, war recht simpler Fehler.

    Jetzt muss ich nurnoch wirklich verstehe, was ich da gecoded habe 😃 ( Das Erstellen der DLL habe ich verstanden, aber dann gings zur WinApi mit Dialog-erstellung und da hat der Tut-Ersteller fast nichts erklärt).
    Schade nur, dass ich auf sowas selber nie gekommen wäre.


Anmelden zum Antworten