• Deutsch
  • Polski

INGENIEURBÜRO PROCHOTTA

Dariusz Prochotta

Dipl.-Ing. (PL)

staatlich anerkannter und vom OLG Hamm ermächtigter Übersetzer für Polnisch

Mitglied im Bundesverband der Dolmetscher und Übersetzer e.V. (BDÜ)

Autohotkey – Modul 02

04.10.2017 Autohotkey Keine Kommentare

Nachdem wir das Programm AutoHotkey installiert und bereits die ersten sehr nützlichen Befehle kennengelernt haben, nämlich:

x::y (ersetzt die Taste „x“ durch die Taste „y“)

::aaa::bbb (ersetzt die Zeichenkette „aaa“ durch die Zeichenkette „bbb“),

gehen wir einen Schritt weiter.

Sehr nützlich wäre z.B. auch, wenn man mit einem Shortcut eine öffnende eckige Klammer am Anfang und eine schließende am Ende eines Textteils einfügen könnte – es stimmt, die eckigen Klammern sind meine Lieblingstasten –, aber ganz ehrlich: Wer mag schon seine Finger andauernd mit der Tastenkombination „AltGr-[“ und „AltGr-]“ strapazieren? Darüber hinaus spare ich mir mit dem Shortcut immerhin einen Anschlag, und das kann sich besonders beim Übersetzen von Gutachten lohnen, wo üblicherweise mit eckigen Klammern auf Quellen verwiesen wird, also [1], [2] usw.

Zuerst überlege ich, wie das Einsetzen der Klammern mit einer physikalischen Tastatur erledigt wird. Notwendig sind die folgenden Schritte:

1) Zuerst den Inhalt schreiben, z.B. die Zahl 24

2) Sprung zum Anfang der Zahl, mit der Tastenkombination Ctrl-left (so macht man das normalerweise; „left“ bedeutet hier die Taste „Pfeil nach links“)

3) Eingabe [

4) Sprung zum Ende der Zahl, mit der Tastenkombination „Ctrl-right“

5) Eingabe ]

6) Eingabe Leertaste

Diese Schritte lassen sich in einer AHK-Datei durch folgenden Code darstellen:

^Numpad1:: ; die Kombination „Ctrl-1“ (auf dem numerischen Tastaturblock) startet das Skript

SendInput {Ctrl down}{Left}{Ctrl up}  ; Sprung zum Anfang eines Wortes

sleep, 200 ; wartet 200 Millisekunden, damit der Befehl ausgeführt werden kann

SendInput [ ; fügt eine öffnende Klammer ein

sleep, 200

SendInput {Ctrl down}{Right}{Ctrl up}  ; Sprung zum Ende eines Wortes

sleep, 200

SendInput ]{Space} ; fügt eine schließende Klammer und einen Leerschritt ein

sleep, 200

return ; Ende des Skripts

Alles, was hinter dem Semikolon steht, sind optionale Kommentare – man kann sie einfügen, wenn man will, man muss aber nicht.

Dazu noch ein paar Erläuterungen:

^Numpad1::  ist der auslösende Shortcut. Die Tastenkombination „Ctrl-1“ löst nacheinander sämtliche Aktionen aus, die sich zwischen dem Shortcut und dem abschließenden Return befinden. Selbstverständlich kann dies auch eine andere Tastenkombination als „^Numpad1“ sein.

Der Befehl SendInput sendet simulierte Tastatureingaben an die aktive Anwendung (dort, wo sich der Cursor befindet).

{Ctrl down}{Left}{Ctrl up} entspricht der Sequenz: „Ctrl“-Taste drücken, Taste „Linkspfeil“ tippen, „Ctrl“-Taste loslassen.

Der Befehl sleep verursacht eine Verzögerung bei der Ausführung. Die Verzögerung wird in Millisekunden angegeben. Die Zahl 200 ist ein Erfahrungswert.

Die Bezeichnungen für sämtliche Tasten finden sich hier.

Und fertig ist unser erstes Skript, das so funktionieren soll:

Vielleicht noch ein weiteres einfaches Beispiel, das dieses Arbeitsprinzip erläutert:

Als ich für meine letzte Steuererklärung mehrere Dutzend PDF-Rechnungen ausdrucken musste, habe ich mich darüber geärgert, dass in der Druckmaske immer die Option „Alle Seiten drucken“ aktiv ist. Normalerweise will ich nämlich nur die erste Seite drucken und muss dementsprechend die Option mit der Maus aktualisieren.

Die Maske sieht etwa so aus:

Ich möchte nun also mithilfe eines AHK-Skripts dieses Druckformular aufrufen, die Option „Aktuelle Seite“ aktivieren und dann den Druckvorgang starten.

Wie immer überlege ich zuerst, mit welcher Tastenfolge auf der physikalischen Tastatur sich diese Aktionen durchführen lässt.

Das Druckformular im PDF-Programm lässt sich standardmäßig mit „Ctrl-p“ aufrufen.

Um die Option „Aktuelle Seite“ zu aktivieren, muss ich 7-mal nacheinander die Taste „Tab“ und anschließend einmal die Taste „Pfeil nach unten“ (Down) tippen. Möglicherweise verläuft diese Sequenz bei anderen Adobe-Reader-Versionen ein klein wenig anders, aber das ist sehr leicht herauszufinden.

Mein neues Skript sieht nun so aus:

^Numpad2::

send {Ctrl down}p{Ctrl up}

sleep, 500 ; weil die Druckmaske sich erst nach einer gewissen Verzögerung zeigt

SendInput {Tab}

sleep, 200

SendInput {Tab}

sleep, 200

SendInput {Tab}

sleep, 200

SendInput {Tab}

sleep, 200

SendInput {Tab}

sleep, 200

SendInput {Tab}

sleep, 200

SendInput {Tab}

sleep, 200

SendInput {Down}

sleep, 200

SendInput {Enter} ; der „Drucken“-Button im Formular ist aktiv, deshalb reicht ein „Enter“ aus

sleep, 200

return

So weit, so gut. Wichtig ist, dass vor dem Auslösen des Skripts das gewünschte PDF-Dokument aktiv ist.

Noch wichtiger: Bevor ein Skript ausgeführt wird, muss alles gespeichert werden.
Das hat etwas mit dem großen Nachteil dieser Programmierungsart zu tun. Sollte z.B. Acrobat Reader aus irgendeinem Grund die Druckmaske innerhalb 500 Millisekunden nicht aufrufen, stimmen die folgenden Befehle nicht mehr. Das passiert auch, wenn ich vergesse, das PDF-Dokument zu aktivieren und mich noch z.B. im Word-Programm befinde. In einem solchen Fall muss ich aber nicht hilflos zuschauen, sondern kann das Skript sofort abbrechen.

Dafür gibt es die Anweisung ExitApp.

Und so lässt sich die entsprechende Zuweisung durchführen:

#z::ExitApp ; Abbruch mit „Win-z“

return

Jetzt unterbricht der Shortcut „Win-z“ („Win“ = Taste „Windows“) das laufende Skript (den entsprechenden Shortcut sollte man sich sehr gut merken).

Meine vollständige Skriptdatei sieht jetzt etwa so aus:

#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.

; #Warn ; Enable warnings to assist with detecting common errors.

SendMode Input ; Recommended for new scripts due to its superior speed and reliability.

SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.

#z::ExitApp ; Abbruch mit — Win + z — !!!

return

^Numpad1::

SendInput {Ctrl down}{Left}{Ctrl up}

sleep, 200

SendInput [

sleep, 200

SendInput {Ctrl down}{Right}{Ctrl up}

sleep, 200

SendInput ]{Space}

sleep, 200

return

^Numpad2::

SendInput {Ctrl down}p{Ctrl up}

sleep, 500

SendInput {Tab}

sleep, 200

SendInput {Tab}

sleep, 200

SendInput {Tab}

sleep, 200

SendInput {Tab}

sleep, 200

SendInput {Tab}

sleep, 200

SendInput {Tab}

sleep, 200

SendInput {Tab}

sleep, 200

SendInput {Down}

sleep, 200

SendInput {Enter}

return

Das letzte Skript ist aber nicht besonders geistreich.

Es lässt sich auch so schreiben:

^Numpad2::

SendInput {Ctrl down}p{Ctrl up}

sleep, 500

Loop 7 {

   SendInput {Tab} ; der Einzug ist nicht notwendig, schafft aber besseren Überblick

   sleep, 200

}

SendInput {Down}

sleep, 200

SendInput {Enter}

return

Die Konstruktion:

Loop 7 {

…..

…..

}

ist ein sehr wichtiges Element der Programmierung: eine Schleife. In diesem Fall sorgt sie dafür, dass die Anweisungen SendInput {Tab} und sleep siebenmal wiederholt werden. Die entsprechenden, zu wiederholenden Anweisungen werden immer in geschweiften Klammern zusammengefasst.

Wenn ich ein Skript modifiziert habe, muss ich dieses natürlich speichern und im Windows-Explorer aufrufen. Sollte dieses Skript bereits aktiv sein (grünes Icon sichtbar auf der Bildschirmleiste), erhalte ich die folgende Meldung, die ich bestätigen muss:

„An older instance of this script is already running. Replace it with this instance?“

Fortsetzung folgt

Wenn Euch dieser Beitrag gefällt, könnt Ihr ihn gerne mit dem Button „Gefällt mir“ kommentieren.

Tags: