Commandbar - die Kommandozeile kommt zurück (naja, fast :D)

  • Abend an alle,

    hab mal nen Tool geschrieben das es ermöglicht in einem GUI in eine ComboBox Befehle auszuwählen, die man vorher im selben Ordner als Textfile abgelegt hat.
    Dadurch kann man schnell mehrere Programme starten und ist bissl übersichtlicher anstatt der ganzen Klickerei und man muss sich nicht die ganzen Hotkey-Belegungen merken (falls man so wie ich auf der Tastatur ca. 40 Hotkeys vergeben hat :D, strg+0-9,win+0-9,strg+numpad0-9,win+numpad0-9. Ja, es könnte sein, dass ich ein bisschen faul und gemütlich bin, zumindest im Windows-Alltag :D :D).

    War mal ne kleine nette Spielerei/Übung für ComboBoxen, Arrays, Trays und GUIs ;)
    Vielleicht könnt ihr ja das Skript/Tool gebrauchen oder Teile hiervon.

    So hier noch schnell das Skript mit schlanken 155 Zeilen:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiComboBox.au3>
    #include <ComboConstants.au3>
    #include <array.au3>
    #include <file.au3>
    Opt("TrayMenuMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    $file = @ScriptDir & "\commands.txt"
    Dim $arCmds[1000][2]
    $close_after_cmd = 0
    $hotkey = 1
    $cmd = 0

    [/autoit] [autoit][/autoit] [autoit]

    If FileExists($file) = 1 Then
    _read()
    Else
    MsgBox(266304, 'Commands.txt','Datei nicht existent. Datei nun angelegt im selben Verzeichnis in der die .exe liegt.'&@CRLF&'Bitte in diese Datei Befehle im folgender Art eintragen:'&@CRLF&'NAME DES BEFEHLS;2.NAME DES BEFEHLS!PFAD ZUR DATEI/ORDNER'&@CRLF&'Dies könnte z.Bsp. so aussehen: mozilla;firefox!C:\Programme\Firefox\Firefox.exe'&@CRLF&'Namen der Kommandos werden mit ; getrennt ohne Leerzeichen und vom Namen des Befehls zum Speicherort mit !'&@CRLF&'Es können beliebig viele Namen vergeben werden aber nur ein Pfad zur Datei/Ordner.'&@CRLF&'Namen die doppeltvorkommen werden nicht aufgenommen und im txt-File gekennzeichnet mit # genauso das selbe mit Pfaden die nicht existieren.'&@CRLF&'Aktualisierung der Befehle findet nur dann statt, wenn das Tool beendet und dann neu angestartet wird.'&@CRLF&'Tool wird automatisch beendet wenn keine Commands.txt existiert und wenn keine gültigen Einträge vorhanden sind. Bitte als (Befehls-)Namen nur Buchstaben verwenden.'&@CRLF&'Viel Spaß noch mit dem Tool, greets Stormy aka Patrick.')
    FileWriteLine($file, "")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func _read()
    $lines = _FileCountLines($file)
    For $i = 1 To $lines
    $line = FileReadLine($file,$i)
    If $line <> "" Then
    $check = StringLeft($line,1)
    If $check <> "#" Then
    $arMark = StringSplit($line,"!")
    If $arMark[0] = 2 Then
    If FileExists($arMark[2]) = 1 Then
    $arSemi = StringSplit($arMark[1],";")
    For $ii = 1 To $arSemi[0]
    If $arSemi[$ii] <> "" Then
    $end = UBound($arCmds)
    $existent = 0
    For $iii = 1 To $end
    If $arCmds[$iii-1][0] = $arSemi[$ii] Then
    $existent = 1
    ExitLoop
    EndIf
    Next
    If $existent = 0 Then
    $arCmds[$cmd][0] = $arSemi[$ii]
    $arCmds[$cmd][1] = $arMark[2]
    $cmd += 1
    EndIf
    EndIf
    Next
    EndIf
    EndIf
    EndIf
    EndIf
    Next
    EndFunc ;==>_read

    [/autoit] [autoit][/autoit] [autoit]

    $hGui = GUICreate("Commandbar",220,40,-1,-1,BitOR($WS_CAPTION,$WS_OVERLAPPED,$WS_SYSMENU))
    $hCombo = GUICtrlCreateCombo("",10,10,200,20,BitOR($CBS_SORT,$CBS_LOWERCASE,$CBS_DROPDOWN,$CBS_SIMPLE,$CBS_AUTOHSCROLL))
    For $counter = 0 To $cmd - 1
    GUICtrlSetData($hCombo,$arCmds[$counter][0]&" _"&$counter)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $tGui = TrayCreateItem("Befehl ausführen/GUI öffnen")
    TrayCreateItem("")
    $tCAC = TrayCreateItem("Nach Befehl GUI schließen")
    $tHotkey = TrayCreateItem("Strg+1 als Hotkey setzen")
    TrayCreateItem("")
    $tExit = TrayCreateItem("Beenden")

    [/autoit] [autoit][/autoit] [autoit]

    _hotkey()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    If WinActive("Commandbar") = 1 Then
    HotKeySet("{enter}","_accept")
    Else
    HotKeySet("{enter}")
    EndIf
    $msg_gui = GUIGetMsg()
    $msg_tray = TrayGetMsg()
    Select
    Case $msg_gui = $GUI_EVENT_CLOSE
    _guiclose()
    Case $msg_tray = $tExit
    _trayclose()
    Case $msg_tray = $tCAC
    _cac()
    Case $msg_tray = $tHotkey
    _hotkey()
    Case $msg_tray = $tGui
    _guiopen()
    EndSelect
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _accept()
    $current = GUICtrlRead($hCombo)
    $length = StringLen($current)
    $position = StringInStr($current, "_", 0, -1)
    $count = $length - $position
    $nr = StringRight($current, $count)
    ShellExecute($arCmds[$nr][1])
    If $close_after_cmd = 1 Then _guiclose()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _guiopen()
    GUISetState(@SW_SHOW, $hGui)
    TraySetState(2)
    HotKeySet("^1")
    HotKeySet("#t")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _guiclose()
    GUISetState(@SW_HIDE)
    TraySetState(1)
    HotKeySet("{enter}")
    If $hotkey = 1 Then
    $hotkey = 0
    Else
    $hotkey = 1
    EndIf
    _hotkey()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _trayclose()
    GUIDelete($hGui)
    HotKeySet("#t")
    HotKeySet("^1")
    HotKeySet("{enter}")
    TraySetState(2)
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _hotkey()
    If $hotkey = 1 Then
    HotKeySet("^1")
    HotKeySet("#t","_guiopen")
    TrayItemSetText($tHotkey,"Strg+1 als Hotkey setzen")
    $hotkey = 0
    Else
    HotKeySet("#t")
    HotKeySet("^1", "_guiopen")
    TrayItemSetText($tHotkey,"Windows+T als Hotkey setzen")
    $hotkey = 1
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _cac()
    If $close_after_cmd = 1 Then
    $close_after_cmd = 0
    TrayItemSetText($tCAC,"Nach Befehl GUI schließen")
    Else
    $close_after_cmd = 1
    TrayItemSetText($tCAC,"Nach Befehl GUI nicht schließen")
    EndIf
    EndFunc

    [/autoit]


    und natürlich das Skript zum Downloaden ;)
    autoit.de/wcf/attachment/2548/


    Grüße und schönen Abend noch an alle

    Stormy/Patrick