Maus Hook überprüfen, ob er noch läuft?



  • Hey,

    ich hab in meinem Tool nen WH_MOUSE_LL Maus Hook über eine DLL am laufen. Das Teil tut auch alles was es soll, nur manchmal kommt es vor, dass der Hook plötzlich nicht mehr funktioniert. Passiert bei mir sehr sehr selten, bei manchen anderen recht oft. Ich vermute es liegt daran, dass irgendwann mal ein anderes Programm die Hook Chain löscht oder nen Hook drüberlegt oder sonst irgendwas. Mein Tool macht jedenfalls nix in der Richtung. Nun würde ich gerne soetwas einbauen wie "Teste mal alle 10sec ob der Hook noch geht, wenn nicht dann neu setzen. Aber wie könnt ich das überprüfen? Das Hookhandle geht ja nicht auch NULL, das bekommt davon ja nix mit...

    Jemand eine Idee?



  • Du könntest den Hook ja einfach immer neu setzen, wenn du ein paar Sekunden lang keinen Input mehr bekommen hast.

    Besser wäre es aber vermutlich, wenn du draufkommst, wieso der Hook auf einmal nichtmehr funktioniert.


  • Mod

    Man kann die Hook Chain an sich nicht umgehen.
    Man kann auch nicht prüfen ob ein Hook noch geht.
    Außer ein anderer Hook gibt eben keine Daten mehr weiter und ignoriert die Mausaktion.
    Hooks dürfen nunmal viele da sein.
    Aber Du könntest für so einen Fall ja mal alle Module auflisten lassen, wenn bei einem Kunden so was passiert. Dann könntest Du vergleiche anstellen, ob es einen anderen Hook gibt, der für das Problem sorgt (gleicher DLL Name, evtl. sogar Installationsverzeichnis) .

    Ich würde vtl. eher ein Problem bei Dir sehen. Dass Du z.B. das Hook-Handle überschreibst o.ä.



  • Also Hook handle neu setzen, wenn kein Input kommt ist problematisch, weil es um diesen Input geht. Mein Programm reagiert ja auf Maustasten, aber es kann auch sein, dass der User mal 20sec garkeine Maustaste drückt. Ich kann nicht unterscheiden, ob jetzt kein Input kommt oder ob der Hook kaputt ist. Klar wenn jetzt 2 Minuten nix kommt, könnt ich den mal neu setzen, aber das ist nicht so gut, weil dann der User 2 Min lang nix machen kann.

    HookHandle überschreiben tu ich auf keinen Fall, ich rufe die Init Funktion genau einmal auf und da wird alles gesetzt.

    Blöder Bug ...

    Wie liste ich denn alle Module auf ?



  • Also ich habe folgende Theorie: Wenn ich es hinbekomme, dass mein Programm ein Dummy mouse_event losschickt und mein Hook dieses auffängt, dann läuft der Hook noch richtig. Mein Problem ist jetzt nur, dass ich natürlich schlecht unterscheiden kann, was ein "richtiger" Mausklick war und was mein Dummy Mausklick mit "mouse_event". Es gibt bei mouse_Event noch das Feld "dw_extraInfo", aber das bekomme ich nicht wieder ausgelesen.

    Ich schicke z.B. das hier von meinem Programm aus los:
    mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 99);

    Mein Hook empfängt das MausEvent aber kann die extra Info mittels
    printf("%d\n",GetMessageExtraInfo());

    nicht auslesen. Ich bekomm hier immer "0" anstatt 99.

    Ziel wäre es dann, wenn ich meinen selbst ausgelösten Dummyclick gefunden habe, diesen aufzufressen und nicht weiter zu leiten, sondern nur die Info, dass er angekommen ist und das wäre dann die Bestätigung, dass mein Hook noch läuft.

    Aber wie könnte ich das machen? Mache ich was mit der extra Info falsch?



  • schick doch einfach ein move mit delta = (0, 0)
    das sollte nicht weiter stören, und reichen, damit dein hook eine message bekommt



  • ja aber woher weiß der Hook, dass die Message vom Programm kommt, und nicht vom User?



  • OMFJC
    wieso sollte der hook diese information benötigen?



  • OMFJC
    Weil ich zu einem bestimmten Zeitpunkt ein mouse_event abschicken möchte und ich sehen möchte, ob genau DIESES Event beim Hook ankommt.

    Es geht grundsätzlich darum: wie kann ich erkennen, ob mein Hook noch am laufen ist? Am einfachten, wenn ich noch Nachrichten von ihm bekomme. Doch kann es einfach sein, dass der User seine Maus mal 30sek nicht benutzt, dann "denkt" mein Programm, der Hook sei abgestürzt. Deshalb will ich alle 5sec oder so ein Ereignis abschicken (mouse_event) welches dann wiederrum vom Hook abgefangen wird. Nun finde ich kein "Dummy" Moseevent, sondern nur welche, die den User stören könnten (Mausklicks, Mousemoves usw).

    Mousemove ist im übrigen auch eher weniger geeignet, weil diese Nachricht viel zu oft gesendet wird und ich nicht ein Thread damit beauftragen will "höre, ob der Hook noch Mousemoves schickt", weil ich die Nachricht eigentlich nicht brauche. Deshalb dachte ich an die extraInfo im MouseEvent, aber die kann ich nicht auslesen.



  • ok Problem gelöst.

    Über
    MSLLHOOKSTRUCT * m = (MSLLHOOKSTRUCT*)lParam;
    und dann
    printf("%d\n",(int)m->dwExtraInfo);

    in der HookProc bekomm ich die extraInfo, die ich über mouse_event abgeschickt habe. So kann ich selbstgeschickte Events von "user Events" unterscheiden.



  • hier stand mist


Anmelden zum Antworten