Funktion/GUI schliessen, Script soll aber weiter laufen

  • Hallo Leute,

    möchte einen transparenten Schriftzug während einer Installation anzeigen lassen. Hab im Forum was gutes gefunden, aber leider läufts nich so wie ich gern hätte. Der Schriftzug soll nur solange angezeigt werden, wie die Setup.exe läuft, dann verschwinden und mit der _dosomething() weiter machen. Habe es mit ProcessWaitClose probiert und auch über das Return gelesen - bin aber zu doof das anzuwenden :D Vllt. kann einer von euch mir sagen ob und wie das funktioniert? Danke schonmal...

    Spoiler anzeigen
    [autoit]


    #RequireAdmin
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    #NoTrayIcon

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

    ShellExecute(@ScriptDir & "\setup.exe")
    If WinWait("[W:605;H:367]", "") Then _window() ;wenn das Fenster von der Setup.exe kommt die transparente GUI und bringt sich in den Vordergrund
    ;wie kann man das Fenster [W:605;H:367] dann wieder aktivieren?
    ;wenn die Setup.exe fertig ist, soll sich die Func _window() schliessen/beenden und mit der Func _dosomething() weitermachen

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

    Func _window()
    setWinHide("Test",600,200,0,0)
    setText(20,10,"Groß geschriebener Text",0x000000,"MS Reference Sans Serif",30)
    ;setText(20,60,"Klein geschriebener Text")

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE ;ProcessWaitClose("setup.exe")

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

    EndFunc

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

    ;myFunction
    Func setText($x,$y,$text,$color=0x00000D,$fontname="MS Times New Roman",$textgroesse=12)
    local $label = GUICtrlCreateLabel ($text, $x, $y,StringLen($text)*$textgroesse,$textgroesse*2)
    GUICtrlSetFont($label, $textgroesse, 400, -1, $fontname)
    GUICtrlSetColor($label, $color)
    EndFunc

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

    ;Erstellt eine transparente GUI
    Func setWinHide($title, $width, $height, $left, $top)
    local $hGui = GUICreate($title, $width, $height, $left ,$top ,$WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))
    local $bkcolor = 0xffffff
    GUISetBkColor($bkcolor)
    DllCall("user32.dll", "int", "SetLayeredWindowAttributes", "hwnd", $hGui, "long", $bkcolor, "byte", 255, "long", 0x03)
    GUISetState()
    EndFunc

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

    Func _dosomething()

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

    ;do something

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

    EndFunc

    [/autoit]
  • sollte doch so funktionieren.
    Einfach warten bis der Prozess (ProcessWaitClose) nicht mehr existiert.
    Bei deinem "If WinWait" sehe ich keinen Sinn.

    [autoit]

    #RequireAdmin
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    #NoTrayIcon

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

    ShellExecute(@ScriptDir & "\setup.exe")
    _window()
    _dosomething()

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

    Func _window()
    setWinHide("Test", 600, 200, 0, 0)
    setText(20, 10, "Groß geschriebener Text", 0x000000, "MS Reference Sans Serif", 30)

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

    Do
    Sleep(100)
    Until ProcessWaitClose("setup.exe")
    EndFunc ;==>_window

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

    ;myFunction
    Func setText($x, $y, $text, $color = 0x00000D, $fontname = "MS Times New Roman", $textgroesse = 12)
    Local $label = GUICtrlCreateLabel($text, $x, $y, StringLen($text) * $textgroesse, $textgroesse * 2)
    GUICtrlSetFont($label, $textgroesse, 400, -1, $fontname)
    GUICtrlSetColor($label, $color)
    EndFunc ;==>setText

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

    ;Erstellt eine transparente GUI
    Func setWinHide($title, $width, $height, $left, $top)
    Local $hGui = GUICreate($title, $width, $height, $left, $top, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))
    Local $bkcolor = 0xffffff
    GUISetBkColor($bkcolor)
    DllCall("user32.dll", "int", "SetLayeredWindowAttributes", "hwnd", $hGui, "long", $bkcolor, "byte", 255, "long", 0x03)
    GUISetState()
    EndFunc ;==>setWinHide

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

    Func _dosomething()

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

    ;do something

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

    EndFunc ;==>_dosomething

    [/autoit]
  • Warum sollte deine GUI auch von selbst verschwinden wenn du nichts machst ausser die Warteschleife zu verlassen. Um eine GUI unsichtbar zu machen benötigst du guisetstate() und um eine GUI dauerhaft zu löschen guidelete(). Bei beiden Funktionen ist es sinnvoll das Handle zur GUI mit anzugeben, da ansonsten immer nur die zuletzt erstellte GUI gelöscht bzw. unsichtbar gemacht werden kann. Deine Funktion welche die GUI erstellt sollte also das Handle der GUI mit return zurückgeben, ansonsten hast du später im Scriptverlauf keine Möglichkeit mehr die GUI gezielt zu manipulieren. Einfacher ist es natürlich wenn man alle GUIs und deren Elemente global außerhalb einer Funktion erstellt, dann braucht man sich keinen abbrechen um die einzelnen Variablen innerhalb des Scriptes weiterzureichen.

    Hier mal eine erweiterete Variante von Tweakys Script:

    Spoiler anzeigen
    [autoit]


    #RequireAdmin
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    #NoTrayIcon

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

    ShellExecute(@ScriptDir & "\setup.exe")
    _window()
    _dosomething()

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

    Func _window()
    $myGUI = setWinHide("Test", 600, 200, 0, 0)
    setText(20, 10, "Groß geschriebener Text", 0x000000, "MS Reference Sans Serif", 30)

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

    Do
    Sleep(100)
    Until ProcessWaitClose("setup.exe")
    guidelete($myGUI) ; löscht deine GUI
    EndFunc ;==>_window

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

    ;myFunction
    Func setText($x, $y, $text, $color = 0x00000D, $fontname = "MS Times New Roman", $textgroesse = 12)
    Local $label = GUICtrlCreateLabel($text, $x, $y, StringLen($text) * $textgroesse, $textgroesse * 2)
    GUICtrlSetFont($label, $textgroesse, 400, -1, $fontname)
    GUICtrlSetColor($label, $color)
    EndFunc ;==>setText

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

    ;Erstellt eine transparente GUI
    Func setWinHide($title, $width, $height, $left, $top)
    Local $hGui = GUICreate($title, $width, $height, $left, $top, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))
    Local $bkcolor = 0xffffff
    GUISetBkColor($bkcolor)
    DllCall("user32.dll", "int", "SetLayeredWindowAttributes", "hwnd", $hGui, "long", $bkcolor, "byte", 255, "long", 0x03)
    GUISetState()
    Return $hGUI ; gibt das Handle der GUI zurück
    EndFunc ;==>setWinHide

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

    Func _dosomething()

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

    ;do something

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

    EndFunc ;==>_dosomething

    [/autoit]
  • Wünsche euch allen frohe Weihnachten!!! :D

    Hab noch ein kleines "Problemchen". An einer Stelle (der Zielauswahl) schafft es das Setup trotz $WS_EX_TOPMOST die transparente GUI in den Hintergrund zu schieben und sie kommt auch nicht wieder in den Vordergrund. Gibt es da eine Möglichkeit das zu umgehen?

    [EDIT]
    Hab es mal mit WinSetOnTop in der _window() Func probiert, damit scheints zu funktionieren - aber wie schaut es mit der Richtigkeit?

    Spoiler anzeigen
    [autoit]


    Func _window()
    $myGUI = setWinHide("Test", 600, 200, 0, 0)
    setText(20, 10, "Groß geschriebener Text", 0x000000, "MS Reference Sans Serif", 30)

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

    Do
    Sleep(100)
    WinSetOnTop($myGUI, "",1)
    Until ProcessWaitClose("setup.exe")
    guidelete($myGUI) ; löscht deine GUI
    EndFunc ;==>_window

    [/autoit]

    Einmal editiert, zuletzt von dieselwiesel (28. Dezember 2014 um 13:23)