"Lokaler" Hotkey für bestimmte Funktion?

  • Hi @ all
    ist es möglich einen Hotkey nur zuzulassen, wenn das Script in einer best. Funktion hängen bleibt?

    Dachte an...

    ...funktioniert aber nich so wie gedacht :(

  • Alle Autoit-Funktionen werden blockiert, wenn du in einer Programmberechnung bist. Einzige ausnahme sind Windows-Messages, da diese an das System zurückgegeben werden müssen, um dort weiter behandelt zu werden.
    Mit GuiRegisterMsg, oder hooks kannst du auf diese Windowsmessages reagieren und deine bearbeitung abbrechen.
    Auf welche Message du genau reagieren möchtest kannst du ja selbst mal gucken.
    Bsp: Ich hab das mal genutzt für eine Live-Suche. Während man in ein Inputfeld tippt, wird nach jedem Buchstaben gesucht und der Inhalt in eine Listview geladen. Das Laden wurde abgebrochen, sobald eine neue Eingabe getätigt wurde.


    Das ist aber alles recht Fortgeschritten. Falls das zu schwer ist, poste mal den Code von dem, was hängen bleibt. Dort kann man was einbauen, was eine Unterbrechung ermöglicht.

  • Naja, durch ein paar Tricks geht das auch relativ unkompliziert. Spontan fallen mir sogar drei Methoden ein.

    • Hotkey temporär deaktivieren
      Du arbeitest einfach mit ganz normalen HotKeys per HotKeySet. Wichtig ist nur, dass du den HotKey am Ende der Funktion, in der er aktiv sein soll, wieder löscht. Dies funktioniert, indem du den zweiten Parameter bei HotKeySet weglässt: HotKeySet("{ESC}")
    • Dauerhafte Abfrage mit _IsPressed
      Sollte deine betreffende Funktion eine Schleife verwenden, musst du einfach dauerhaft mittels _IsPressed (Misc.au3) den Status der Escape-Taste abfragen. Geht prinzipiell, ist aber strukturbedingt nicht in jedem Fall eine wirklich praktikable Lösung.
    • AccelKeys in Verbindung mit dem OnEvent-Mode
      Das habe ich zwar noch nicht getestet, das müsste aber auch gehen. Wenn deine GUI im OnEvent-Mode arbeitet, wird - unabhängig von der derzeitigen Position im Skript - immer zur hinterlegten Funktion gesprungen. Das machen wir uns zu Nutze, indem wir einen AccelKey (Shortcut => Escape) auf ein Dummy-Control legen, welches mit einer Exit-Funktion verknüpft wird. Am Ende der Funktion wie bei Möglichkeit 1 diese Verknüpfung einfach wieder lösen (=> GUISetAccelerators). Vor- bzw. Nachteil: Dieser Hotkey funktioniert nur, wenn der Benutzer die GUI des Skriptes im Fokus hat.

    All diese Möglichkeiten greifen aber nur, wenn - wie von Kanashius angedeutet - keine einzelne Funktion das Skript blockiert. Wenn zum Beispiel ein DllCall 30 Sekunden dauert, dann kann man da nichts machen. Wenn man allerdings mit purem AutoIt arbeitet, werden selbst größere Berechnungen meist in mehrere Schritte (-> Schleife) aufgeteilt. Da funktioniert das o.g., weil ja keine einzelne Funktion das Skript so lange blockiert.

  • Ah cool. Auf das Angebot komme ich unter Umständen sehr gerne zurück. Je nachdem, ob ich alleine durchsteige oder nicht :)
    Allerdings kann ich die au3 nicht laden. Da kommt der unschöne "fatal error".
    Könntest du die Datei bitte nochmals hochladen?

    Grüße autoiter

  • @Kanashius & chesstiger
    Danke erstmal für eure Antworten!


    Habe bis vorgestern an mir selbst gezweifelt, dann hab ich rausgefunden das mas ein Script u. die comp. EXE "sowieso" mit ESC beenden kann. Das hatte ich vorher noch nie ausprobiert :D (Kann man das evtl. auch ausschalten?)

    Es sollte das Script während/nach einer "fehlgeschlagener" Treiberinstallation (mit Fehlercode) beenden - funktioniert aber nich so einfach wie gedacht. Habe rausgefunden, das ein fehlendes KB Update dafür verantwortlich war. Habe dann eine Checkfunktion eingefügt, die schaut ob das Update installiert ist und eine weitere die den Status abfragt u. ggf. an dieser Stelle abbricht.