Mousehook - Daten asynchron verarbeiten

  • Ich habe ein Problem mit einem Script (bzw. 2 Scripts) die eine Desktop-Lupe auf dem Bildschirm anzeigen. Das wird über einen MouseHook gemacht, der eine Callback Funktion immer dann aufruft wenn die Maus bewegt wird. Dann muss die GUI aktualisiert werden um den neuen Bildschirmausschnitt anzuzeigen.

    Wie die Überschrift schon sagt, versuche ich nun eine Möglichkeit zu finden die Daten, die bei jedem Aufruf der Callback Funktion verarbeitet werden müssen, entweder asynchron (parallel) oder zeitversetzt (möglichst einfach) zu verarbeiten. Das muss ich unbedingt so machen, weil die Verarbeitung in meinem Fall recht lange dauert. Es soll nämlich ein Bildschirmausschnitt in eine sich bewegende GUI kopiert werden (wie eine Bildschirmlupe).
    Die Callback Funktion des Hooks muss aber so schnell wie möglich mit Return beendet werden, da sonst die Maus für das gesamte System extrem langsam wird (Windows löst den Hook auf wenn die Funktion nicht nach einer bestimmten Zeit beendet wird).

    Also habe ich versucht mit diversen Timern (einmaliges AdlibRegister, QueueTimer, _Timer_SetTimer) aus der Callback Funktion die zweite Funktion die den grafischen Teil ausführen soll zeitverzögert aufzurufen (damit die andere Funktionn davor beendet wird). Leider waren die Resultate nicht sonderlich beeindruckend und AutoIt ist mir mehrmals mit seltsamen Fehlermeldungen abgeschmiert (AutoIt scheint mehrere DllCallbacks nicht zu mögen).
    Nach einigem Experimentieren habe ich schließlich 2 Scripte geschrieben. Das erste Script überwacht mit dem Hook die Maus und sendet über eine Unique Windows Message die Mausposition an das Fenster des zweiten Scripts. Im zweiten Script ist die Hauptfunktion mit der gleichen Windows Message registriert und erhält die Daten bei jedem Aufruf.

    So funktioniert das Ganze nun zwar, aber das ist mir eigentlich viel zu umständlich das mit 2 Scripten zu machen (und dann auch noch so kompliziert)...
    Daher lautet nun meine Frage: Geht das nicht auch einfacher? ^^

    Edit: Beide Scripte müssen ins gleiche Verzeichnis und TimerSlave.au3 muss zuerst gestartet werden.

    • Offizieller Beitrag

    Die 2-Skript-Variante ist m.M. hier die eleganteste und sinnvollste Lösung.
    Wenn du das in einem Skript regeln willst, mußt du deine (zu lange dauernden) Funktionen irgendwie in einem Queue parken und abarbeiten lassen während der Hook-Return bereits erfolgte. Sicher ist das nicht unmöglich, aber vermutlich recht aufwändig.
    Wenn du also mit der Arbeitsweise deiner Lösung zufrieden bist, solltest du es ruhig dabei belassen. Es sei denn, es hat jemand tatsächlich eine Variante in petto, die die Problematik auflöst.

  • Das habe ich mir schon gedacht, schließlich ist alles andere schief gelaufen :(... Trotzdem danke, BugFix ;).
    Ich werde es vorerst mal offen lassen, vielleicht kommt ja noch zufällig jemandem eine Idee.
    Ob ich das in Skripte posten sollte um zu zeigen wie man sowas machen könnte... ?( Mit Hooks und eigenen Windows Nachrichtencodes gibt es ja noch nicht sonderlich viele Scripte.