Script in Systray minimieren

  • Servus :)

    da ich noch blutiger Anfänger beim AutoIT-Scipten bin, wollte ich hier mal nachfragen, ob ihr mir bei einem Problem helfen könnt.
    Ich komm einfach nicht weiter, aber ist wahrscheinlich nur ne ganz kleine Sache ^^

    Und zwar habe ich quasi ein GUI gemacht mit 4 Buttons. Die sind derzeit nur mit msgboxen zum testen belegt.
    Das wichtigste ist, dass das Script in den Systray minimiert werden und auch wieder aufgerufen werden kann.

    Das funktioniert auch schon ganz gut, aber irgendwie funktionieren meine Buttons nicht mehr, seit ich die Funktion für die Minimierung benutze.
    Ich hab schon ewig rumprobiert, ob ich vielleicht etwas in der falschen Reihenfolge habe oder Ähnliches, aber ich hab nix gefunden :(

    So sieht mein Code aus:

    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiStatusBar.au3>
    #include <WindowsConstants.au3>
    #include <GuiToolbar.au3>
    #include <Constants.au3>
    Opt("TrayAutoPause", 0)
    Opt("TrayMenuMode", 1)

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

    GuiCreate("Programmname", 250, 80)
    GuiSetState(@SW_SHOW)

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

    $Button_1 = GuiCtrlCreateButton("Button1", 5, 5, 100, 30)
    $Button_2 = GuiCtrlCreateButton("Button2", 5, 45, 100, 30)
    $Button_3 = GuiCtrlCreateButton("Button3", 145, 5, 100, 30)
    $Button_4 = GuiCtrlCreateButton("Button4", 145, 45, 100, 30)

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

    $foo = TrayCreateItem("Restore Window")
    TrayItemSetState(-1, $TRAY_DEFAULT)
    TraySetClick ( 0 )
    TraySetToolTip("Programmname")

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

    While 1
    $trayMsg = TrayGetMsg()
    If $trayMsg = $foo Then
    GuiSetState(@SW_SHOW);show GUI
    Opt("TrayIconHide", 1);hide tray icon
    EndIf

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

    $msg = GuiGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then Exit

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

    If $msg = $GUI_EVENT_MINIMIZE Then
    GuiSetState(@SW_HIDE);hide GUI
    Opt("TrayIconHide", 0);show tray icon
    EndIf
    WEnd

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $Button_1
    MsgBox(0, 'testing1', 'test1')
    Case $msg = $Button_2
    MsgBox(0, 'testing2', 'test2')
    Case $msg = $Button_3
    MsgBox(0, 'testing3', 'test3')
    Case $msg = $Button_4
    MsgBox(0, 'testing4', 'test4')
    EndSelect
    WEnd

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

    GuiSetState()
    While GuiGetMsg() <> $GUI_EVENT_CLOSE
    WEnd

    [/autoit]
  • Du musst die 2 Schleifen zu einer zusammenfassen ;) einfach das Select Case Konstrukt nach oben in die Schleife nehmen :)

    Die untere Schleife kannst du dann komplett rauslöschen :)

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Das liegt daran, dass du 2 While schleifen hast.

    Es wird nur die erste ausgeführt (da es eine Endlosschleife ist).
    Du fragst also nie ab, was passieren soll, wenn man auf die Buttons drückt.

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiStatusBar.au3>
    #include <WindowsConstants.au3>
    #include <GuiToolbar.au3>
    #include <Constants.au3>
    Opt("TrayAutoPause", 0)
    Opt("TrayMenuMode", 1)
    Opt("TrayIconHide", 1)

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

    GuiCreate("Programmname", 250, 80)
    GuiSetState(@SW_SHOW)

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

    $Button_1 = GuiCtrlCreateButton("Button1", 5, 5, 100, 30)
    $Button_2 = GuiCtrlCreateButton("Button2", 5, 45, 100, 30)
    $Button_3 = GuiCtrlCreateButton("Button3", 145, 5, 100, 30)
    $Button_4 = GuiCtrlCreateButton("Button4", 145, 45, 100, 30)

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

    $foo = TrayCreateItem("Restore Window")
    TrayItemSetState(-1, $TRAY_DEFAULT)
    TraySetClick ( 0 )
    TraySetToolTip("Programmname")

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

    While 1
    $trayMsg = TrayGetMsg()
    Switch $trayMsg
    Case $foo
    GuiSetState(@SW_SHOW);show GUI
    Opt("TrayIconHide", 1);hide tray icon
    EndSwitch

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

    $msg = GUIGetMsg()
    Switch $msg
    Case $Button_1
    MsgBox(0, 'testing1', 'test1')
    Case $Button_2
    MsgBox(0, 'testing2', 'test2')
    Case $Button_3
    MsgBox(0, 'testing3', 'test3')
    Case $Button_4
    MsgBox(0, 'testing4', 'test4')
    Case $GUI_EVENT_MINIMIZE
    GuiSetState(@SW_HIDE);hide GUI
    Opt("TrayIconHide", 0);show tray icon+
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    So sollte es funktionieren.
    PS: Ich empfehle Switch/Case oder Select/Case statt If/Else/Endif abfragen für Zeitkritische Sachen (zb. um zu überprüfen ob ein Button gedrückt wurde.) . Switch / Select sind schneller