AutoIt: Terminal
- Wird von mir gemacht, bitte nur wenn's fertig ist was ändern.
- Danke!!
Was ist ein Teminal?
BearbeitenEin Terminal ist ein Programm, dass Kurzbefehle interpretiert (wie z.B. cmd.exe von Microsoft). Wir wollen nun selber ein ähnliches Programm schreiben.
Aufbau
BearbeitenAls erstes machen wir eine grobe Strukturierung mit Regionen:
#Region Head
; hier kommen Includings, Optionen etc. hin.
#EndRegion Head
#Region GUI
; Hier schreiben wir später die GUI hinein
#EndRegion GUI
#Region Interpret
; Hier werden die Eingaben später interpretiert
#EndRegion Interpret
#Region Funktionen
; Hier kommen Funktionen hinein.
#EndRegion Funktionen
Die GUI
BearbeitenAls nächstes bauen wir die GUI auf:
Wir definieren zunächst in der Region Head folgendes:
Opt("GUIOnEventMode", 1)
; Die einzelnen Elemente sollen Funktionen aufrufen.
In die Region GUI gehört erst ein Formular:
$Form1 = GUICreate("Command", 616, 269, -1, -1)
; das Fenster soll zentriert werden.
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
; beim schließen soll die Funktion Form1Close ausgeführt werden
Global $Input1 = GUICtrlCreateInput("", 8, 240, 601, 21)
; Das Texteingabefeld, in das die Befehle eingetippt werden können.
GUICtrlSetOnEvent(-1, "Input1Change")
; Bei Änderung (also wenn ENTER gedrückt wird), soll der Befehl interpretiert werden
Global $Edit1 = GUICtrlCreateEdit("", 8, 8, 601, 225)
; Hier kommt die History rein.
Wir müssen nun die Includings einbinden:
#include <GuiEdit.au3>
#include <GUIConstantsEx.au3>
Starten des Terminals
BearbeitenDas Terminal soll folgendermaßen aufgerufen werden: Eine beliebige Tastenkombination wird betätigt und die GUI wird angezeigt. Das setzt folgendes voraus:
- Das Programm muss im Hintergrund laufen
- Eine Tastenkombination muss definiert werden
- Das Programm muss die GUI immer zeigen wenn die Tastenkombination aufgerufen wird.
- Genau so sollte die GUI auch versteckt werden.
Als erstes definieren wir die Tastenkombination in der Region Head:
HotKeySet("^+c", "_show")
; Tastenkombination: Strg + SHIFT + c
Nun definieren wir die Funktionen _show und Form1Close in der Region GUI, da das noch zur GUI gehört!
Func _show()
GUISetState(@SW_SHOW, $Form1)
EndFunc ;==>_show
Func Form1Close()
GUISetState(@SW_HIDE, $Form1)
EndFunc ;==>Form1Close
Ein Vorteil von $GUI_EVENT_CLOSE ist: Die Funktion wird auch ausgeführt, wenn ALT + F4 oder STRG + W etc. gedrückt wird.
In die Region GUI gehört unter die GUI noch folgendes:
While 1
Sleep(100)
WEnd
Das ist ein Leerlauf, der dafür sorgt, dass das Programm sich nicht beendet, wenn keine Befehle anstehen.
Interpretation
BearbeitenNun haben wir folgendes Skript:
#Region Head
#include <GuiEdit.au3>
#include <GUIConstantsEx.au3>
Opt("GUIOnEventMode", 1)
Opt("TrayIconHide", 1) ;Tray-Icon verstecken.
HotKeySet("^+c", "_show")
#EndRegion Head
#Region GUI
$Form1 = GUICreate("Command", 616, 269, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
Global $Input1 = GUICtrlCreateInput("", 8, 240, 601, 21)
GUICtrlSetOnEvent(-1, "Input1Change")
Global $Edit1 = GUICtrlCreateEdit("", 8, 8, 601, 225)
While 1
Sleep(100)
WEnd
Func _show()
GUISetState(@SW_SHOW, $Form1)
EndFunc ;==>_show
Func Form1Close()
GUISetState(@SW_HIDE, $Form1)
EndFunc ;==>Form1Close
#EndRegion GUI
#Region Interpret
#EndRegion Interpret
#Region Funktionen
#EndRegion Funktionen
Ich habe noch das Tray-Icon versteckt. Nun müssen wir einen Interpreter einbauen. Das geschieht in der Funktion Input1Change(): Wenn ENTER gedrückt wird, sollen die Daten angenommen und interpretiert werden.
Ab jetzt werde ich immer die ganze Region Interpret angeben. Zuerst muss der Befehl in eine Variable geschrieben werden, dann wird er ins Edit geschrieben. Dann wird Input1 geleert. Wir werden anstelle der Variable ein Array nehmen, dann können der Funktion gleich Optionen mitgeliefert werden (wie z.B. shutdown \? in der Windows-Konsole).
#Region Interpret
Func Input1Change()
Local $Answer = StringSplit(GUICtrlRead($Input1), " ")
GUICtrlSetData($Input1, "")
_GUICtrlEdit_AppendText($Edit1, "> " & _ArrayToString($Answer, " ", 1) & @CRLF)
EndFunc ;==>Input1Change
#EndRegion Interpret
Als nächstes kommt der eigentliche Interpreter in Form einer Switch-Schleife:
#Region Interpret
Func Input1Change()
Local $Answer = StringSplit(GUICtrlRead($Input1), " ")
GUICtrlSetData($Input1, "")
_GUICtrlEdit_AppendText($Edit1, "> " & _ArrayToString($Answer, " ", 1) & @CRLF)
Switch $Answer[1] ; Die Main Funktion "switchen"
Case "exit" ; Wenn "exit", dann komplett beenden.
Exit
Case "execute" ; Zum ausführen von AutoIt-Zeilen.
If $Answer[0] > 1 Then ; Wenn ein Befehl mitgeliefert wurde, dann...
$Answer2 = _ArrayToString($Answer, "", 2)
Else ; ...sonst...
$Answer2 = InputBox("Input", "Command execute:", "", " ", "-1", "-1", "-1", "-1")
EndIf
Execute($Answer2) ; Zeile ausführen.
Case "clear"
GUICtrlSetData($Edit1, "") ; Edit1 löschen.
Case "print"
_GUICtrlEdit_AppendText($Edit1, _ArrayToString($Answer, "", 2)) ; Text anzeigen, der eingetippt wurde
Case Else ;falls nichts zutrifft:
_GUICtrlEdit_AppendText($Edit1, 'Fehler: "' & $Answer[1] & '" ist eine unbekannte Funktion!' & @CRLF)
EndSwitch
EndFunc ;==>Input1Change
#EndRegion Interpret
Das waren jetzt nur ein paar Grundfunktionen, die mir gerade eingefallen sind. Später mehr...
Funktionen
BearbeitenShutdown
BearbeitenWir werden nun eine Funktion anlegen, die den Computer herunterfahren oder was auch immer kann ;)
In die Switch-Schleife fügen wir einfach folgenden Code ein:
Case "shutdown"
If Not $Answer[0] > 1 Then $Answer[2] = InputBox("Input", "Command Shutdown:", "shutdown", " ", "-1", "-1", "-1", "-1") ;Wenn nichts mitgelifert wurde, InputBox anzeigen.
Switch $Answer[2] ; Zusatzbefehle:
Case "logoff" ; Abmelden
Shutdown(0)
Case "shutdown" ; Herunterfahren
Shutdown(1)
Case "restart" ; Neustarten
Shutdown(2)
Case "energy" ; Energiesparmodus
Shutdown(32)
Case "sleep" ; Ruhezustand
Shutdown(64)
EndSwitch
Für diese Funktion benutzen wir AutoIts Shutdown()-Funktion.
Infos
BearbeitenNun wollen wir eine Funktion machen, die infos zu einem beliebigen Befehl anzeigt: In die Switch-Abfrage gehört folgender Code:
Case "info"
If $Answer[0] > 1 Then ; Wenn kein Parameter mitübergeben wurde, else Teil ausführen: InputBox
$Answer2 = _ArrayToString($Answer, "", 2)
Else
$Answer2 = InputBox("Input", "Command info:", "", " ", "-1", "-1", "-1", "-1")
EndIf
_GUICtrlEdit_AppendText($Edit1, $Answer2 & ": " & _info($Answer2) & @CRLF); Als nächstes wird derRückgabewert einer Funktion angezeigt (s.u.).
Die im Skript beschriebene Funktion müssen wir erst einmal definieren (und das in der Region Funktionen):