GUI zeigen in onevent-mode, sonst unsichtbar

  • Hi leutz,

    ich habe die Tage ein Script geschrieben, dass im Hintergrund laeuft und auf ein ganz bestimmtes Fenster wartet. Sobald dieses Fenster erscheint soll eine GUI aufspringen und mir ein paar "erweiterte" funktionen zu dem Fenster anbieten.

    Mein Problem nun: da das Fenster aus einer anderen Software kommt, die dank Programmierer immer maximized laeuft wollte ich meine Gui immer oben drueber legen. Wenn nun der User diese Gui gerade mal nicht haben will, soll er sie mittels minimze oder exit ins tray schupsen koennen und beim naechsten erscheinen des externen fensters soll die Software einfach wieder erscheinen.

    Da ich diverse dinge parallel machen muss, dachte ich arbeite ich im onevent modus und schiebe in meine einzige while schleife das winwaitactive, den rest wollte ich mittels event loesen weil es aus meiner GUI heraus kommt (entweder schliessen oder einen button gedrueckt) oder aber mittels adlibregister continuirlich laeuft.

    Ich habe nun schon einige Zeit mit lesen verbracht aber irgendwie haenge ich. Kann mir einer ein paar gute quellen nennen, wo ich weiter kommen kann?
    Momentan habe ich folgende Probleme aufgetan:adf

    1) Minimize to tray versus onevent mode (ich habe gelesen als tray and SW_hide wird das script pausiert und meine schleife wuerde stehen bleiben)
    2) wenn ich SW_hide nehme bleibt die leiste in der windows taskbar erhalten, sie soll aber bitte verschwinden
    3) da mein fenster aus der externen software noch existiert laesst meine
    while schleife die auto-IT gui wieder erscheinen da winwaitactive immer
    noch true ist.
    4) in meiner GUI sind eine variable nummer an Buttons, wie kann ich das event definieren, wenn ich keine anzahl an buttons habe? Ich hatte gedacht das mittels eines arrays zu definieren und nur ein event fuer das array als GUI-msg zu definieren. Klappt aber nicht :(

    Sorry, dass ich so viele Fragen auf einmal stelle. Ich denke ich habe da irgendwo nen grossen denkfehler drin oder koennte besser ganz woanders anfangen. Aber durch meine Recherche tun sich immer mehr Fragen auf und irgendwie fehlt mir der gute Ansatz. Ich denke ich habe gerade zu viele workarounds, die sich gegenseitig aushebeln.

    Bitte versteht mich nicht falsch: ich moechte kein fertiges Script. Ich suche nur die richtigen Seiten/Hilfen die ein paar meiner Fragen loesen anstelle neue aufzuwerfen. Ich fuehle mich durchaus in der Lage einige der oben genannten Probleme zu loesen aber alle zusammen ueberfordern sie mich gerade :)

    Mein script habe ich aktuell nicht lauffaehig, da ich erst kuerzlich auf "onevent"-mode umgestellt habe. 95% meines Codes muss noch umgestellt werden aber aktuell scheiter ich daran die Grundlage ans laufen zu kriegen (gui anzeigen, ins tray verschwinden).

    Ich danke im voraus fuer alle tips/hinweise.

    Einmal editiert, zuletzt von Vasco (15. April 2012 um 12:22) aus folgendem Grund: gelöst

  • Hallo Vasco,

    • hast du es denn selbst getestet? Ich habe auch irgendwo im Internet gelesen, dass die Erde eine Scheube sei, kann es aber nicht glauben.
    • Schau dir dazu [autoit]TraySetState[/autoit] an
    • solange es aktiv ist ist dies doch in Ordnung, hier stimmt dann deine Programmlogik nicht. Mach ein Beispielskript mit Notepad als externem Programm und ich schaue mir das Problem an.
    • bau dies in das Beispielskript aus 3 mit ein.

    mfg autoBert

  • Ok ok ok,

    ich sehe ja ein, dass meine Frage schwer zu beantworten war. Habe ueber das Wochenende noch mal etwas weiter gearbeitet und bin denke ich dichter dran. Aber bezueglich meines Fensters anzeigen/ausblenden stehe ich immer noch vor dem Wald und sehe den Baum nicht.

    Also das ist (grob) mein script. Einige Funktionen sind nicht aufgefuehrt, da recht lang und nicht wirklich verlinkt zu meinem Problem. Da sie tun (oder noch komplett leer sind) denke ich hilft es nicht.

    Ich hoffe es noch mal besser zusammen zu fassen was ich eigentlich moechte. Diesmal am Beispiel Notepad :)
    1) Mein Programm laeuft im Hintergrund unsichtbar
    2) Jemand startete notepad
    3) mein Programm soll die Gui anzeigen
    4a) Notepad ist geschlossen --> GUI soll verschwinden
    4b) User entscheidet GUI wird nicht gebraucht und klickt auf exit/minimize --> GUI soll verschwinden
    5) startet bei 1 erneut

    Wenn ich von "GUI soll verschwinden" rede, dann soll sie nicht sichtbar sein. Das Programm soll aber im Hintergrund weiter laufen und auf das naechste Notepad Window warten bzw meine Zwischenablage abhorchen und ggf. die Gui erweitern.
    Da die Software keine Funktion bieten soll ausser Notepad ist da, moechte ich eigentlich auch keine Auflistung in der Taskleiste haben. Es sollte im tray ablaufen um ggf. die Software zu killen (z.B. aus Performance Gruenden,...)

    Hier nun mein (leicht angepasster Code) damit ihr ihn auch lesen koennt.

    #include <GUIConstantsEx.au3>
    #include <File.au3>
    #include <Array.au3>
    #include <WinAPI.au3>
    #include <Constants.au3>
    #include <GuiListView.au3>


    AdlibRegister("_GetClip", 1000); executes the function _GetClip and copies the clipboard into a textfile if a change happend
    Opt("GUIOnEventMode", 1); change to event mode

    ;Initialize variables
    Local $GUIWidth = 300, $Edit_1, $OK_Btn, $Cancel_Btn, $msg
    global $history[1],$comment_window, $max_history=100
    $history[0]=""
    create_gui(); creates one gui named $comment_window with several button/fields/label/lists/tabs/...
    ;define the events
    GUISetOnEvent($GUI_EVENT_CLOSE, "exit_button")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "exit_button")

    While 1
    WinWaitActive("Untitled - Notepad")
    GUISetState(@SW_SHOW,$comment_window)
    sleep (5000)
    WEnd


    func exit_button()
    GUICtrlSetState($comment_window, @SW_HIDE) ; will be hidden as not needed
    TraySetState(1); displays the tray icon
    EndFunc

  • Hallo Vasco,

    • dein Beispielslript läuft nicht, Konsolenausgabe:
      Spoiler anzeigen
    • du solltest deinen Skriptcode in AutoIt-Tags einbetten (Klick auf das AutoItzeichen im Beitrags-Editor), bei längeren SKripten diese in einen Spoiler einbetten (Zeichen SP im Beitrags-Editor)das ganze sieht dann fertig zB. so aus:
      Beispiel Tray mit Adlib
      [autoit]

      #NoTrayIcon
      #include <Constants.au3>
      #include <GUIConstantsEx.au3>
      #include <WindowsConstants.au3>
      #include <Array.au3>

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

      Opt("TrayMenuMode",1) ; Standard Traymenüeinträge (Skript pausieren/beenden) werden nicht angezeigt.
      Opt("TrayIconHide", 1) ;hide the Trayicon
      Opt("GUIOnEventMode", 1) ;ONEvent Mode.
      Opt("TrayOnEventMode",1)

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

      $hGui = GUICreate('Test',575,300,100,100);,$WS_POPUP)
      GUISetOnEvent($GUI_EVENT_CLOSE,"_MyExit")
      GUISetOnEvent($GUI_EVENT_MINIMIZE,"_Minimize")
      GUICtrlSetState(-1, $GUI_DISABLE)
      $idLblAdlibInfo=GUICtrlCreateLabel("",5,5,65,260)
      $hbtnExit = GUICtrlCreateButton("be&enden",500,275,60,20)
      GUICtrlSetOnEvent(-1,"_MyExit")
      TraySetOnEvent($TRAY_EVENT_PRIMARYDOUBLE,"_restore")
      $aboutitem = TrayCreateItem("Über")
      TrayItemSetOnEvent($aboutitem,"_about")
      TrayCreateItem("")
      $exititem = TrayCreateItem("Beenden")
      TrayItemSetOnEvent($exititem,"_MyExit")

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

      TraySetState(2)
      GUISetState()
      AdlibRegister("_TestAdlib")

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

      While 1
      Sleep(1000)
      #cs
      $TRAY_EVENT_SHOWICON -3 Das Trayicon wird gezeigt.
      $TRAY_EVENT_HIDEICON -4 Das Trayicon wird versteckt.
      $TRAY_EVENT_FLASHICON -5 Der Benutzer schaltet das Blinken des Trayicons ein.
      $TRAY_EVENT_NOFLASHICON -6 Der Benutzer schaltet das Blinken des Trayicons aus.
      $TRAY_EVENT_PRIMARYDOWN -7 Die erste Maustaste wurde über dem Trayicon gedrückt.
      $TRAY_EVENT_PRIMARYUP -8 Die erste Maustaste wurde über dem Trayicon losgelassen.
      $TRAY_EVENT_SECONDARYDOWN -9 Die zweite Maustaste wurde über dem Trayicon gedrückt.
      $TRAY_EVENT_SECONDARYUP -10 Die zweite Maustaste wurde über dem Trayicon losgelassen.
      $TRAY_EVENT_MOUSEOVER -11 Die Maus bewegt sich über das Trayicon.
      $TRAY_EVENT_PRIMARYDOUBLE -13 Die erste Maustaste wurde über dem Trayicon doppelgeklickt.
      $TRAY_EVENT_SECONDARYDOUBLE -14 Die zweite Maustaste wurde über dem Trayicon doppelgeklickt.

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

      #ce

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

      WEnd

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

      Func _TestAdlib()
      Static $iNo=1
      Local $sText=GUICtrlRead($idLblAdlibInfo)&$iNo&". Adlibtest"
      Local $aText=StringSplit($sText,@CRLF,1)
      ;_ArrayDisplay($aText)
      $sText=""
      $iStart = UBound($aText)-21
      if $iStart < 1 Then $iStart = 1
      Do
      $sText&=$aText[$iStart] & @CRLF
      $iStart+=1
      Until $iStart=$aText[0]+1
      GUICtrlSetData($idLblAdlibInfo,$sText)
      $iNo+=1
      EndFunc

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

      Func _About()
      MsgBox(32,".. über","Tray...")
      EndFunc

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

      Func _MyExit()
      Exit
      EndFunc

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

      Func _Minimize()
      Opt("TrayIconHide", 0) ;shows the Trayicon
      TraySetState(1)
      GUISetState(@SW_HIDE)
      EndFunc

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

      Func _Restore()
      Opt("TrayIconHide", 1) ;hide the Trayicon
      TraySetState(2)
      GUISetState(@SW_SHOW)
      EndFunc

      [/autoit]

      anhand dieses Beispiels kannst du erkennen, dass nicht alles was man im Internet liest:

      Zitat

      Minimize to tray versus onevent mode (ich habe gelesen als tray and SW_hide wird das script pausiert und meine schleife wuerde stehen bleiben)

      auch stimmt.


    mfg autoBert

  • Ja mal abgesehen davon das sein Script nicht läuft, sollte WinExists weiterhelfen ;)

    [autoit]

    If WinExists("Untitled -") Then
    MsgBox(0, "", "Window exists")
    EndIf

    [/autoit]

    In deinem fall dann also

    [autoit]


    While 1
    If WinExists("Untitled - Notepad") Then
    GUISetState(@SW_SHOW, $comment_window)
    Else
    GUISetState(@SW_HIDE, $comment_window)
    EndIf
    Sleep(5000) ; wozu auch immer die Pause so groß sein soll/muss :D
    WEnd

    [/autoit]
  • Ich danke euch allen. Ihr habt mir ein paar gute Ratschlaege gegeben um mein Problem nun annähernd zu lösen. Von hier aus werde ich mich alleine durchwurschteln.

    Vielleicht noch ein paar Worte zu einigen Antworten: bitte erwartet nicht immer jemanden mit vollem Zugang zum Internet auf das er vollen Einfluss hat. Dank meines Jobs bin ich viel in Asien unterwegs und da sind so Kleinigkeiten wie Java Script nicht immer selbstverstaendlich. Wenn man dann noch auf einen Firmenlaptop angewiesen ist, sieht das noch mal schlechter aus.
    Somit war es mir leider nicht möglich den Code anständig einzubinden.

    Nunja, gelernt habe ich: wenn ich funktionen aufrufe aber nicht auffuehren werde (wie in diesem Fall), dann werde ich zukünftig Dummy funktionen draus machen. Hatte eigentlich gedacht, dass ich das in meinem Beitrag wohl ausreichend erwaehnt habe, dass da diverse Zeilen im Script fehlen aber offenbar war es nicht deutlich genug.

    Nundenn': einige Antworten waren sehr hilfreich (insb. Autolaser)
    Danke dafür