AutoHotkey, Teil 4

GUIs für Kommandozeilen-Tools erstellen

| Autor / Redakteur: Mirco Lang / Stephan Augsten

In Kombination mit AutoGUI und AutoHotkey ist es recht einfach möglich, Systemkommandos mit einer GUI zu versehen.
In Kombination mit AutoGUI und AutoHotkey ist es recht einfach möglich, Systemkommandos mit einer GUI zu versehen. (Bild: Lang / AutoGUI)

Wer typische Windows-Kommandozeilen-Programme mit einer GUI ausstatten möchte, kann dafür auf AutoHotkey, kurz AHK, zurückgreifen. Denn damit lassen sich grafische Oberflächen und Interaktionen mit externen Tools extrem einfach und schnell umsetzen.

Die Skriptsprache AutoHotkey haben wir bereits in unserem dreiteiligen Tutorial von Grund auf vorgestellt. Was fehlt, ist noch ein konkretes Einsatzszenario, das gleichermaßen praktikabel wie praktisch ist.

Im Folgenden zeigen wir Schritt für Schritt, wie Sie erste wirklich nützliche Tools mit AutoHotkey entwickeln können – die es in der Form tatsächlich noch nicht gibt. Und wie es sich für gute Tools gehört, muss AutoHotkey dafür nicht beim Anwender installiert sein. Am Ende stehen simple EXE-Dateien, die ohne Installation beim Anwender laufen.

Wie das genau funktioniert, sollen zwei Beispiele zeigen: Für den Einstieg soll ein Mini-Tool, das schlicht und ergreifend Fenster im Vordergrund halten kann, den Prozess zeigen – noch ohne GUI und ohne Windows-Programm. Anschließend bekommen Sie den Code für ein Programm, um mehrere Instanzen eines Windows-Prozesses in einem Rutsch zu beenden.

Fenster im Vordergrund halten

Manchmal ist es äußerst praktisch, ein Programm im Vollbild laufen zu lassen und ein anderes Programm in einem kleineren Fenster, das sich aber immer im Vordergrund befindet. Beispielsweise, wenn Sie Code in einem Editor im Vollbild schreiben und dabei ein Browserfenster mit Code-Schnipseln zum Abschreiben nutzen.

Das Fenster im Vordergrund ist inaktiv – zu erkennen an der ausgegrauten Fenstertitelleiste.
Das Fenster im Vordergrund ist inaktiv – zu erkennen an der ausgegrauten Fenstertitelleiste. (Bild: Lang / Microsoft)

Dafür bedarf es nicht einmal eines konkreten Windows-Programms, Windows selbst kann diese Einstellung vornehmen, es ist lediglich eine Fenster-Einstellung. Und eine GUI braucht es ebenso wenig. Da Microsoft diese Funktion dem User vorenthält, können Sie hier wirklich sinnvoll tätig werden.

Was Sie benötigen: Ein Tastenkürzel, um das aktuelle Fenster im Vordergrund zu halten und den Effekt aufzuheben und ein Info-Fenster, das dem Nutzer dieses Kürzel mitteilt. Anschließend wird das AutoHotkey-Skript in eine EXE-Datei konvertiert. Wie immer, ist das Beispiel auf den nötigsten Code beschränkt:

MsgBox, Fenster im Vordergrund halten: WIN+STRG+F
^#f::
WinSet, AlwaysOnTop, Toggle, A
return

Nach dem Start informiert zunächst ein Dialog über „MsgBox“ über die aktivierten Tastenkürzel – schließlich vergisst man so etwas schnell. Anschließend wird die Tastenkürzel WIN+STRG+F definiert: „WinSet“ schaltet die Funktion „AlwaysOnTop“ für das aktuelle Fenster („A“) ein und aus („Toggle“) – fertig ist das Skript.

Nun können Sie auf zwei Wegen eine EXE-Datei erzeugen: Entweder rufen Sie den Compiler aus dem Installationsverzeichnis von AutoHotkey auf oder starten den Vorgang direkt aus dem Kontextmenü der erstellten AHK-Datei über den Eintrag „Compile Script“. Wenn Sie den Compiler manuell starten, können Sie auch noch ein eigenes Programm-Icon festlegen – die Corporate Identity soll ja nicht fehlen. Anschließend können Sie die EXE-Datei an Windows-Nutzer verteilen und ihnen eine neue Funktion spendieren.

Prozessinstanzen beenden

Bisweilen kommt es vor, dass ein und derselbe Prozess immer und immer wieder startet und im Task-Manager von Windows letztlich Dutzende Instanzen zu finden sind. Leider bietet der Task-Manager nicht die Option, alle auf einmal zu killen – das geht nur auf der Kommandozeile. Einfacher ginge das freilich über eine kleine GUI: Sie müssen sich keine Befehle und Optionen merken und außerdem können damit auch fachfremde Nutzer tätig werden.

Das fertige Tool: Prozesse auflisten und Instanzen en gros beenden.
Das fertige Tool: Prozesse auflisten und Instanzen en gros beenden. (Bild: Lang / Microsoft)

Was Sie benötigen: Zum einen die grafische Oberfläche selbst, über die laufende Prozesse zunächst ausgelesen und dann in Batch-Manier beendet werden können. Dazu brauchen Sie zwei Buttons, ein Textfeld für die Prozessliste und ein Eingabefeld für den gewünschten Prozess. Zum anderen ein paar Funktionen: Externe Tools starten, deren Ausgaben aufnehmen, nutzen und ausgeben.

Der Workflow sieht also so aus: Sie klicken auf einen Button, um die laufenden Prozesse in einem Textfeld in der GUI anzeigen zu lassen, dann tippen Sie den Namen des gewünschten Prozesses ein und beenden alle Instanzen über einen weiteren Button.

Die GUI können Sie manuell anlegen oder auch mit der in Teil 3 dieses Tutorial vorgestellten AutoHotkey-IDE AutoGUI:

; Generated by AutoGUI 2.2.6a
#NoEnv
#SingleInstance Force
SetWorkingDir %A_ScriptDir%

Gui Add, Edit, x216 y24 w220 h21, Zum Beispiel "calc.exe" oder "calc*"
Gui Add, Edit, x32 y56 w465 h741 +ReadOnly Multi
Gui Add, Button, gsearch x32 y24 w104 h23, Prozesse listen
Gui Add, Button, gkill x448 y24 w43 h23, Beenden
Gui Add, Text, x216 y0 w211 h23 +0x200, Prozess zum Beenden; Wildcard möglich:

Gui Show, w530 h841, Prozessinstanzen beenden
Return

GuiEscape:
GuiClose:
   ExitApp

Zunächst kommen ein paar Standards: „NoEnv“ verhindert, dass geprüft wird, ob leere Variablen Umgebungsvariablen des Systems sind, „SingleInstance Force“ verhindert weitere Instanzen des Tools und „SetWorkingDir“ setzt das Tool-Verzeichnis als Arbeitsverzeichnis.

Es folgt die Definition der GUI, zunächst die beiden „Edit-Elemente“: Die erste Zeile definiert das Eingabefeld mit dem vorgegebenen Hilfe-Text „Zum Beispiel "calc.exe" oder "calc*"“, die zweite Zeile die Textbox für die Prozessliste als „ReadOnly“-Version und mit mehreren Zeilen („Multi“). Die beiden Elemente können Sie später als „Edit1“ und „Edit2“ ansprechen.

Nun legen Sie die beiden Buttons fest, jeweils mit einem g-Label („gsearch“ und „gkill“), was für eine „GoSub“-Anweisung steht; Sie sprechen die Buttons später mit „search:“ und mit „kill:“ an.

Die letzte Zeile blendet noch eine Beschriftung für das Eingabefeld „Edit1“ als fixen „Text“ ein.

Die grafischen Elemente im Einzelnen.
Die grafischen Elemente im Einzelnen. (Bild: Lang)

Mit „Gui Show“ folgt dann der eigentliche Aufruf der GUI mit einem entsprechenden Fenstertitel. Die beiden Anweisungen „GuiEscape“ und „GuiClose“ sorgen dafür, dass das Skript beendet wird, sobald das Fenster über die Escape-Taste oder das „X“ der Fenstersteuerung beendet wird – ansonsten würde das Fenster beendet, das Skript liefe aber im Hintergrund weiter.

Die Programmlogik

An Logik gibt es nun für jeden Button eine Aktion. Den Anfang macht die Suche:

search:
clipboard =
Run cmd /c "tasklist|sort|clip"
ClipWait
GuiControl,, Edit2, %ClipBoard%
GuiControl, Focus, Edit1
return

Über „search:“ wird wie gesagt der oben festgelegte G-Label angesprochen und gleich die erste Code-Zeile deutet schon einen wichtigen Punkt an, nämlich wie hier Daten von externen Tools in das AutoHotkey-Tool wandern – per Zwischenablage, die dazu erstmal geleert wird.

Den Aufruf externer Tools erledigen Sie über den Befehl „Run“: „cmd“ ruft die Kommandozeile auf, die Option „/c“ sorgt dafür, dass das Fenster nach Abschluss wieder geschlossen wird. In der Eingabeaufforderung werden nun die laufenden Tasks gelistet („tasklist“), dann alphabetisch sortiert („sort“) und anschließend in die Zwischenablage ausgegeben („clip“).

„ClipWait“ sorgt dafür, dass der Code erst weiter ausgeführt wird, wenn sich etwas in der Zwischenablage befindet – daher das Leeren im ersten Schritt. Über das erste „GuiControl“ wird nun das Element „Edit2“, also die große Multiline-Textbox, neu erstellt und mit dem Inhalt der Zwischenablage („%ClipBoard%“) gefüllt. Das zweite GuiControl sorgt nur dafür, dass der vorgegebene Hilfe-Text im Eingabefeld „Edit1“ im Fokus, also markiert bleibt; einfach als kleine optionale Hilfe.

Drei Dinge können Sie aus dem bisschen Code lernen: Erstens das Aufrufen externer Tools; wichtig sind die /c-Option und die Anführungszeichen um die eigentlichen Befehle. Zweitens, dass Sie Daten über das Clipboard übergeben können; auf AutoHotkey-Seite über die eingebaute Variable „ClipBoard“ und auf Windows-Seite über „clip“. Und drittens, dass Sie GUI-Elemente über „GuiControl“ neu zeichnen und somit auch aktualisieren lassen können.

Für den zweiten Button mit dem G-Label „gkill“ folgt nun der restliche Code:

kill:
ControlGet, processkill2, Line, 1, Edit1
MsgBox, 4,, %processkill2% wirklich beenden?
IfMsgBox No, return
clipboard =
Run cmd /c "taskkill /F /IM %processkill2% 2>&1|clip"
ClipWait
MsgBox, %ClipBoard%
GoSub, search
return

Der User hat nun also die Prozesse ausgelesen und den gewünschten Prozessnamen in das Eingabefeld „Edit1“ eingegeben; an dieser Stelle sind übrigens auch Wildcards gestattet. Diese Nutzereingabe wird nun über „ControlGet“ aus „Edit1“ ausgelesen und in der Variablen „processkill2“ gespeichert.

Es folgt eine kurze Sicherheitsabfrage über den bekannten MsgBox-Dialog. Achtung: Wenn Sie mit dem Tool beispielsweise alle Instanzen von „svchhos*“ beenden, ist ein hübscher Bluescreen garantiert!

Es folgt Bekanntes: Die Zwischenablage wird geleert und dann wieder über einen „cmd /c“-Aufruf befüllt. Das Kommando ist hier „taskkill“: „/F“ erzwingt das Beenden, „/IM“ gibt den Prozessnamen an, hier in der Variablen „processkill2“ gespeichert, und „2>&1“ leitet wie üblich die Fehlerausgabe in die Standardausgabe um. Fehler- oder Erfolgsmeldung werden dann wieder an die Zwischenablage gepiped und über einen erneuten MsgBox-Dialog ausgegeben.

„GoSub, search“ führt dann letztlich erneut die Suche aus, damit der Nutzer in der GUI auch sieht, dass die Prozesse verschwunden sind. Jetzt müssen Sie das Ganze nur noch kompilieren das Tool ist fertig.

Auf die gleiche Art und Weise können Sie beliebige andere CLI-Tools mit grafischen Oberflächen versehen. Natürlich gibt es andere/elegantere Methoden, aber der Weg über die Zwischenablage ist sehr universell und kommt mit einem absoluten Minimum an Code aus.

Kommentare werden geladen....

Kommentar zu diesem Artikel

Der Kommentar wird durch einen Redakteur geprüft und in Kürze freigeschaltet.

Anonym mitdiskutieren oder einloggen Anmelden

Avatar
Zur Wahrung unserer Interessen speichern wir zusätzlich zu den o.g. Informationen die IP-Adresse. Dies dient ausschließlich dem Zweck, dass Sie als Urheber des Kommentars identifiziert werden können. Rechtliche Grundlage ist die Wahrung berechtigter Interessen gem. Art 6 Abs 1 lit. f) DSGVO.
  1. Avatar
    Avatar
    Bearbeitet von am
    Bearbeitet von am
    1. Avatar
      Avatar
      Bearbeitet von am
      Bearbeitet von am

Kommentare werden geladen....

Kommentar melden

Melden Sie diesen Kommentar, wenn dieser nicht den Richtlinien entspricht.

Kommentar Freigeben

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

Freigabe entfernen

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Kontaktieren Sie uns über: support.vogel.de/ (ID: 45678576 / Coding & Collaboration)