Autohotkey für KIX

Ohne Autohotkey kann ich mir meinen Desktop mittlerweile nicht mehr vorstellen. Das pfiffige Helferlein macht vieles einfacher. Höchste Zeit, sich damit auch mal bei BUOA.de zu beschäftigen.

Für eine freie Software ist Autohotkey überdurchschnittlich gut dokumentiert. Wer sich „reinfuchsen“ will, kann das sehr einfach tun, sogar mit einer vorzüglich übersetzten deutschen Hilfedatei. Allerdings ist es – wie sooft – das Eine, wenn mir Funktionen beschrieben werden, aber etwas ganz anderes, wenn die auf eine konkrete Situation übertragen werden sollen.

Pimp your KIX!

An meinen Arbeitstagen dreht sich aktuell alles um KIX. Das ist ein webbasiertes Open Source Ticket-, Helpdesk- und Service-System. Entstanden ist es aus OTRS – das namentlich aktuell sicher noch etwas bekannter ist.

So schick das mit Web-Anwendungen im Browser ist, so ist es doch etwas anderes als mit einer „richtigen“ Desktop-Anwendung. Die hat konzeptionsbedingt bei diversen Funktionalitäten mehr Möglichkeiten. Das ein oder andere fehlende „Wohlfühl-Feature“ lässt sich mit Autohotkey jedoch problemlos nachrüsten.

Handlichere Textbausteine

KIX verfügt über eine Textbaustein-Funktion, mit der sich komplette Inhalte in einem Ticket zusammenstellen lassen. Tastenfanatiker wie ich müssen dafür jedoch zur Maus greifen und rumklicken. Mit Autohotkey bleiben die Finger an den Tasten:

::#dl::Die aktuelle Version von KIX können Sie hier herunter laden:{Enter}{Enter}https://www.kixdesk.com/de/download/installationsanleitungen.html

Die Eingabe von #dl gefolgt von einem Leerzeichen löst sich in den Text nach den zwei Doppelpunkten auf. Der Link wird mit dem {Enter}{Enter} noch in einen eigenen Absatz geschoben. Wer es noch flotter haben will, setzt zwischen die beiden ersten Doppelpunkte ein Sternchen :*:#dl expandiert dann sofort unter allen Umständen.

Das ist die „schlichte“ Textbaustein-Variante. Für KIX bietet sich jedoch an, in bestimmten Situationen die erweiterten Möglichkeiten des integrierten Texteditors zu nutzen. Der lässt sich über die HTML-Funktion der Zwischenablage ansprechen1:

:*:#anfordern::
 CBackup := ClipboardAll
 WinClip.Clear()
 WinClip.SetText("Bitte senden Sie mir`r`n-einen Screenshot`r`n-eine detaillierte Fehlerbeschreibung`r`n-die Versionsnummer.`r`n`r`n")
 WinClip.SetHTML("<p>Bitte senden Sie mir <ul><li>einen Screenshot</li><li>eine detaillierte Fehlerbeschreibung</li><li>eine Versionsnummer.</p>")
 WinClip.Paste()
 WinClip.Clear()
 Clipboard := CBackup
 CBackup =
return

Mit diesem – etwas aufwändigeren – Textbaustein passe ich mich den jeweiligen Gegebenheiten an. Zeilenweise mache ich Folgendes:

  1. Ich definiere meinen Text-Shortcut, der sofort ausgeführt wird Ich speichere die aktuelle Zwischenablage in eine Variable, damit sie nicht verloren geht.
  2. Ich lösche die Zwischenablage.
  3. Ich trage meinen Textbaustein in reiner Textform in die Zwischenablage ein. Für Zeilenumbrüche verwende ich die Steuerbefehle `r`n .
  4. Ich trage meinen Textbaustein in HTML-Schreibweise in die Zwischenablage ein.
  5. Ich gebe die Zwischenablage aus – abhängig vom Ziel wird der reine Text oder formatierter Text ausgegeben.
  6. Ich lösche die Zwischenablage
  7. Ich stelle den ursprünglichen Wert der Zwischenablage wieder her
  8. Ich leere die Variable
  9. Ich beende das „Unterprogramm #anfordern“.

Bequeme Wiedervorlagen

Ein wichtiges Instrument in einem Ticketsystem wie KIX sind die Wiedervorlagen, z.B. für die Nachfrage, ob die Antwort zum Erfolg geführt hat. Weil für diese Nachfrage keine Reaktionszeiten relevant sind, lassen sie sich sehr einfach in den Tagesverlauf integrieren, wenn sie mit einer Uhrzeit vor Arbeitsbeginn versehen sind. Dann liegen diese „Wohlfühl-Services“ schön aufgereiht vor, es ist sofort klar was anliegt und kann bequem über den Tag verteilt bearbeitet werden.

Ich lege mir meine Rückfragen gern im Wochenrhythmus fest. Wenn ich später frage, hatte der Kunde Zeit für die Bearbeitung und ich spare mir damit eine wiederholte Anfrage, wenn er es noch nicht erledigen konnte.

Das Problem steckt – abhängig von der KIX-Konfiguration – im Detail:

Der Eingabebereich für die Wiedervorlage in KIX

Die Eingabefelder haben „Unterstützer“. Im Datumsfeld gibt es einen optionalen Kalender, im Zeitfeld ein aufklappendes, vorgegebenes Zeitraster. Letzteres ist ein (kleiner) Hemmschuh bei der Nutzung von Autohotkey: Es dauert ein bisschen, bis die Liste auf, bzw. zugeklappt ist. Wird das berücksichtigt, ist aber auch das kein Problem:

; in x Wochen um 6 Uhr
:*:++#::
   InputBox, UserInput, Wochen, Wiedervorlage in, , 150, 100
  if UserInput = 
    Exit
    Var1 = %A_Now% 
    Var2 := 7 * UserInput
    EnvAdd, Var1, Var2, Days
    FormatTime, Var1, %Var1%, dd.MM.yyyy
    Send, +{home}%Var1%{tab}06:00
    Sleep, 400
    Send, {NumpadUp}{tab}{tab}{esc}
    Sleep, 400
    Send, {esc}
Return

Ich platziere den Cursor an das Ende des Datumsfeld. Mit der Tastenfolge (die natürlich auch anders sein kann!) +­+­# wird ein Dialog geöffnet, in den ich die Anzahl Wochen eintrage, die ich warten will. Ich rechne das Zieldatum aus („EnvAdd“) und formatiere das Ergebnis in eine Variable („FormatTime“). Dann schicke ich das („Send“) in das Datumsfeld, das mit +{Home} markiert und dem Wert der Variable Var1 überschrieben wird. Anschließend springe ich mit {tab} in das Zeitfeld und gebe eine Zeit vor Arbeitsbeginn ein.

Jetzt muss ich allerdings einen Moment warten („Sleep, 400“), damit das Auswahlfeld diesen Wert auswählen kann. Erst jetzt kann ich das Feld verlassen, sonst wird der Wert nicht übernommen. Die nachfolgende Sequenz ist für die Verwendung in meinem aktuell favorisierten Browser Vivaldi erforderlich. Das kann in anderen Browsern abweichen, hier muss ggf. etwas ausprobiert werden.

Wer lieber „tageweise“ Wiedervorlagen machen möchte, kann das mit dem nachfolgenden Autohotkey-Skript in KIX tun, das Sams- und Sonntage erkennt und den Termin dann auf den nächsten Montag schiebt.

; in x Tagen um 6 Uhr
:*:++ü::
   InputBox, UserInput, Tage, Wiedervorlage in, , 150, 100
  if UserInput = 
    Exit
    Var1 = %A_Now%
    EnvAdd, Var1, UserInput, Days
    FormatTime, Tag, %Var1%, WDay
    ; Sonntag?
    if (Tag = 1) {
       EnvAdd, Var1, 1, Days
    }
    ; Samstag?
    if (Tag = 7) {
       EnvAdd, Var1, 2, Days
    }
    FormatTime, Var1, %Var1%, dd.MM.yyyy
    Send, +{home}%Var1%{tab}06:00
    Sleep, 400
    Send, {NumpadUp}{tab}{tab}{esc}
    Sleep, 400
    Send, {esc}
Return

Ich nehme nicht in Anspruch, dass die hier gezeigten Code-Schnipsel der pfiffigste Weg für die Aufgabe sind. Sie erfüllen bei mir den beschriebenen Zweck. Wer eine cleverere Lösung hat/findet, darf mir die gern schicken.


  1. Das habe ich nur unter Windows ausprobiert. Ob das so auch in anderen Betriebssystemen klappt, weiß ich nicht verbindlich. ↩︎