Textmacros, suchen/ersetzen wie bei Autohotkey

  • Hallo Allerseits,

    auf die Gefahr mit massiv zu blamieren: Ich möchte statt Autohotkey nun AutoIt nutzen weil Autohotkey Sachen nicht ohne Weiteres oder gar kann, welche ich bei AutoIt finde.

    Umgekehrt nutze ich derzeit Autohotkey auch um per Abkürzungen Texte einzufügen (Tastaturmacros).

    Zum Beispiel gebe ich ein "sgdh" und Autohotkey ersetzt dies automatisch gegen "Sehr geehrte Damen und Herren [Enter]".

    Ich habe bei AutoIt in der Befehlsreferenz und in der FAQ geschaut, aber zu meiner Schande finde ich nicht heraus, wie das unter AutoIt geht. Fall sich zu dumm bin wäre ein Beispiel hilfreich. Ansonsten die Info das es mit AutoIt nicht geht.

    Meinen Dank im voraus
    Frank Blatzheim

  • Wo willst du solche Abkürzungen ersetzt haben? In einer eigenen GUI oder in x-beliebigen Programmen / einem bestimmten Programm? In einer eigenen GUI sollte das sehr einfach zu realiseren sein, bei externen Programmen könnte das aufwendiger werden. Vielleicht einfach mal ein AutoHotkey Beispiel posten in dem du diese Funktionalität nutzt?

  • Wo willst du solche Abkürzungen ersetzt haben? In einer eigenen GUI oder in x-beliebigen Programmen / einem bestimmten Programm? In einer eigenen GUI sollte das sehr einfach zu realiseren sein, bei externen Programmen könnte das aufwendiger werden. Vielleicht einfach mal ein AutoHotkey Beispiel posten in dem du diese Funktionalität nutzt?


    Danke für die Antwort. Ich benutze systemübergreifend in allen (Windows7)Programmen dieselben Macros. Das macht den Reiz aus: Deine Ersetzungen gehen überall automatisch, wo Du Text eingeben kannst - egal ob Textverarbeiteung, branchenspezifische Software, Email, Browser und und ...

    Autohotkey ist ja ständig im Hintergrund aktiv, fragt anscheinend die Tastatur ab und ersetzt dann eingegebene Phrasen automatisch. Der Befehl dazu lautet #hotstring. Damit beginnt eine Datei, in welcher dann die Phrasen samt Ersetzung untereinander stehen. Beispiel:

    #hotstring
    ::sgf :: Sehr geehrte Frau
    ::sgdh :: Sehr geehrte Damen und Herren
    ::sgh :: Sehr geehrter Herr
    ::mfg :: Mit freundlichen Grüßen

    Also ersetze "sgf" mit "Sehr geehrte Frau"

    Vieleicht war ich auch nur zu blauäugig? Weil Autohotkey und AutoIt dieselben Wurzeln haben dachte ich, das ich unter AutoIt auch diese "Hotstrings" einfach nachbilden oder funktionsgleich verwenden könnte.

    Mit freundlichen Grüßen
    Frank Blatzheim

    Nachklapp:
    Ich habe gerade noch über "Onkel Google" hier in einem Forum eine ähnliche Anfrage gefunden (http://www.autoitscript.com/forum/topic/87…ngs-for-autoit/). Dort wurde die Function _IsPressed als Lösungsansatz empfohlen. Also müsste ich wahrschinlich ein Script schreiben, was alle Strings über _IsPressed abfragt und welches permanent läuft (Endless Loop)?

    Einmal editiert, zuletzt von shietegal (30. März 2014 um 17:01)

    • Offizieller Beitrag

    Also müsste ich wahrschinlich ein Script schreiben, was alle Strings über _IsPressed abfragt und welches permanent läuft (Endless Loop)?


    So einfach ist es leider nicht. Mit _IsPressed wirst du keine Möglichkeit haben in allen x-beliebigen Editierfeldern wirksam zu werden.
    Um das mit AutoIt zu lösen musst du wohl mit einem Keyboard-Hook arbeiten.
    Das heisst:
    - Abfangen der Keyboard-Taste
    - ist dieses Bestandteil deines Textmakros (z.B. das "s" aus "sgf") schaltest du den Ersetzmodus aktiv, das Zeichen wird nicht an das Editfeld weitergesendet
    - nächstes Zeichen wird abgefangen: ist es aus einer Kombination eines Textmakros wird auch dieses nicht gesendet, sondern zwischengespeichert
    - ist die zwischengespeicherte Sequenz identisch mit einem Makro, wird der hinterlegte Text gesendet
    - ergibt die Zwischenspeicherung kein Makro wird diese selbst eingefügt
    Hat aber den Nachteil, dass Buchstaben, mit denen ein Makro beginnt zuerst nicht an das Programm gesendet werden obwohl kein Makro genutzt werden soll. Das könntest du dann eventuell umgehen, indem du die Sequenz schreiben läßt und bei Übereinstimmung mit einem Makro für die Anzahl der Zeichen zuerst Backspaces sendest und dann den Ersetzungstext.

    NB:
    Ein Keyboard-Hook läßt sich leider leicht als Keylogger mißbrauchen. Aus diesem Grund wirst du hier keine skriptmässige Unterstützung dafür erhalten. Aus der Hilfe läßt sich aber mit etwas Wissen alles Notwendige erfahren.

  • Zitat von »shietegal«



    Also müsste ich wahrschinlich ein Script schreiben, was alle Strings über _IsPressed abfragt und welches permanent läuft (Endless Loop)?

    NB:
    Ein Keyboard-Hook läßt sich leider leicht als Keylogger mißbrauchen. Aus diesem Grund wirst du hier keine skriptmässige Unterstützung dafür erhalten. Aus der Hilfe läßt sich aber mit etwas Wissen alles Notwendige erfahren.

    Nochmal danke für die Hilfe. ich habe jetzt festgestellt, das der Wunsch, die Hotstring-Funktion von Autohotkey unter AutoIt nutzen zu können doch öfter ausgesprochen wird. Ich habe einen fertigen Code gefunden (http://www.autoitscript.com/forum/topic/68…string-hotkeys/), erst einmal gespeichert aber noch nicht genau analysiert. Sieht aber schon einmal gut aus. Der Link ist vieleicht noch für andere Suchende nützlich? Wie gut es funktioniert werde ich hier berichten, wenn ich es am Laufen habe.

    Zum Thema Keylogger finde ich persönlich es schade, wenn es keine Scripts mehr gibt, nur weil das missbräuchlich genutzt werden kann. M.E. verhindert solches Verhalten keinen Missbrauch. Bestenfalls macht man ehrlichen Usern das Leben schwerer.

    Der versuch, die Verbreitung von Wissen zu unterdrücken ist IMHO so als wollte man das Licht in die Sonne zurück stopfen. Wollte ich einen Keylogger schreiben würde ich einen Int-Handler in Assembler aufsetzen (habe zwar zuletzt vor 20 Jahren mit dem MASM gearbeitet aber das kriege ich noch hin) :)

    Mit freundlichen Grüßen
    Frank Blatzheim

  • Zitat


    Wollte ich einen Keylogger schreiben würde ich einen Int-Handler in Assembler aufsetzen


    Das will ich sehen. Ein Keylogger, der mit INTs unter Windows NT (2000 bis 8.1, egal welches davon) arbeitet... :P
    Nenene: Mit Interrupts kommst du bei einem NT-Kernel nicht weit, da helfen nur API-Calls (ansonsten bist du auf den 16-Bit Emulator beschränkt). ^^

    Und so ein Missbrauch ist leider schon zu oft vorgekommen... Was aber natürlich nicht die Verbreitung von Wissen beeinträchtigen sollte.

    Gruß

    • Offizieller Beitrag

    Zum Thema Keylogger finde ich persönlich es schade, wenn es keine Scripts mehr gibt, nur weil das missbräuchlich genutzt werden kann.


    Das Problem ist einfach, wie trenne ich die schwarzen von den weissen Schafen? ;)
    Ein Keylogger ist ja perse auch nicht schlecht. Ich habe z.B. einen erstellt, den ich bei Problemen unserer User mit einer bestimmten Software anwende. Ist dieser Prozeß aktiv, startet der Logger mit einem vom User zu bestätigendem Hinweis, dass innerhalb dieser Software jeder Tastaturanschlag und jeder Mausklick protokolliert wird. Bei Mausklicks wird ein Screenshot von der Mauszeigerumgebung gespeichert, bei Tastaturereignissen der entsprechende Tastenwert. Mit einem Programm, das dann die Logeinträge wiedergibt mit entsprechenden Texteingaben und Bildern lassen sich auf diese Weise Fehlbedienungen der User wunderbar lokalisieren. Da hilft dann auch nicht die Ausrede "Ich habe gar nichts gemacht, das ging plötzlich nicht mehr." :D
    Leider ist der missbräuchliche Einsatz solcher Programme recht häufig. Und wir möchten hier ungerne Steilvorlagen liefern. Ausserdem ermöglicht allein das Lesen der Hilfe (vernünftige AutoIt-Kenntnisse vorausgesetzt) problemlos ein entsprechendes Programm zu erstellen. Mit dem entsprechenden Hinweis auf die erforderliche Funktion ist doch der Fragestellung genüge getan. Und ich kann nicht mal im Ansatz erkennen, dass hier die Verbreitung von Wissen unterdrückt wird.

  • [quote='shietegal','index.php?page=Thread&postID=357966#post357966']Das Problem ist einfach, wie trenne ich die schwarzen von den weissen Schafen? ;)

    Bei allen Sachen, die sowohl gut als auch böse genutzt werden können: Gar nicht?
    (....Nein, ich erkläre nicht wie du deine Messer schärfen kannst, sonst bringst Du noch Jemand mit dem Messer um....)
    Ich habe Verständnis für Zensur wenn ganz klar ist, das es nur um eine böse Nutzung gehen kann. Im Zweifel für den Fragenden.
    Das wird aber jetzt heftig Off Topic.

    Noch einmal danke für die Hilfe, MISTERSPEED schulde ich auch Dank - er hat mir gerade in dem Moment einen Link gepostet wie ich diesen auch gefunden habe.

    Jetzt habe ich aber festgestellt: Gibt es unter Autoit keine Textausgabe, welche nicht mit MsgBox passiert? Das Hotstring-Script arbeitet so:
    [...]
    HotStringSet ("sgdh" , "_teststart1" ) ; Hier die Funktionen und den HotString definieren.
    While 1
    Sleep(1000) ; Wie bei HotKeySet auch, eine While um
    WEnd ; das Script am Leben zu erhalten.

    Func _teststart1 () ; Die Funktion, die aufgerufen wird wenn man, wie im Beispiel hier z.B. "sgdh", irgendwo eingibt.

    MsgBox (0, "Test", "Sehr geehrte Damen und Herren")
    Exit
    EndFunc
    [...]

    Damit kann ich jetzt in eine Messagebox schreiben, ich müsste aber in den Tastaturpuffer(?) schreiben. Es soll ja eine automatische Eingabe da erfolgen, wo ich gerade "sgdh" eingegeben habe.

    Mit freundlichen Grüßen
    Frank Blatzheim

  • Nunja die Hilfe von Autoit ist dein Freund, da findest du jedemenge Dinge die Autoit kann inklusive praktischen Beispielen. ;)

    Die primitivste und einfachste Lösung ist wohl die msgbox aus dem dortigen Beispiel durch ein

    [autoit]

    send(...)

    [/autoit]


    zu ersetzen.

    Send() schickt alle gewünschten Tastenbefehle an das gerade aktive Fenster/Control. Bei umfangreichen sends kann das aber auch gern mal schief gehen und in einem anderen Fenster landen, außerdem ist send nicht unbedingt schnell, aber letzlich für deine Aufgabe absolut ausreichend.

    Etwas zuverlässiger wäre

    [autoit]

    controlsend()
    ;bzw.
    controlsettext()

    [/autoit]

    . Dazu benötigst du aber eindeutige Informationen über das Fenster und Control welches du ansprechen willst. Außerdem gibt es Programme die keine Standardcontrols verwenden. Diese Lösung ist also für eine dynamische und flexible Lösung wie du sie suchst eher nicht geeignet und sollte bevorzugt dann verwendet werden wenn du ein bestimmtes Programm steuern willst über das alle nötigen Informationen vorliegen.

    Für Textausgaben gibt es neben msgboxen im übrigen noch jedemenge Alternativen, auch wenn das nun nichts mehr mit deinem Vorhaben zu tun hat:

    [autoit]


    consolewrite
    stdinwrite
    filewrite
    iniwrite
    traytip
    splashtexton
    ; eigene gui mit labeln...

    [/autoit]

    2 Mal editiert, zuletzt von misterspeed (31. März 2014 um 19:53)

  • Ich habe Verständnis für Zensur wenn ganz klar ist, das es nur um eine böse Nutzung gehen kann. Im Zweifel für den Fragenden.


    Wie du schon selbst festgestellt hast ... es ist ziemlich Off Topic.

    Und jetzt das Grosse ABER:
    ich möchte doch mal ausdrücklich klarstellen das es sich hier wenn überhaupt, um keine böswillige Art der Zensur handelt. Natürlich schränkt das von BugFix geschilderte Problem den freien Informationsfluss bedingt ein. Allerdings nur ab dem Punkt, ab dem der Fragende selbst nicht gewillt ist, auf unsere codefreien Hinweise einzugehen und sich dieses, ich nenn es mal "gefährliche Wissen" selbst aneignet.

    Würden wir garnicht darüber reden wollen, gäbe es nur eine Art der Reaktion auf solche Fragen: Thema schliessen bzw. löschen