Sichtbar gemachte Fenster (@SW_SHOW) nicht bedienbar

  • Hejo

    Ich habe wiedermal ein Problem. Und zwar kann ich unsichtbare AutoIt-Forms, die ich über ein zweites Script sichtbar mache, nicht bedienen. Angeklickte Buttons zb lösen kein Event aus, auch wenn optisch das Form voll da ist.

    Beispiel - Folgende Scripte irgendwo speichern, und nacheinander ausführen:

    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Form1 = GUICreate("Test Test Test", 230, 118, 192, 124)
    $Button1 = GUICtrlCreateButton("Klick mich!", 60, 34, 125, 49, $WS_GROUP)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    MsgBox(0,"","Erfolg")
    EndSwitch
    WEnd

    [/autoit][autoit]

    WinSetState("Test Test Test","",@SW_SHOW)

    [/autoit]

    Wenn nun das 2. Script die GUI des 1. sichtbar macht, kann man sie nicht bedienen. :(

  • wenn du das von Hauke meinst:
    Ich hab selber mal was geschrieben, beidem die GUI in einem anderen skript gespeichert ist und per Func dann aufgerufen wird.
    Da war auch das Problem da dass es angezeigt wird aber eben nicht bedienbar war.
    Ich hab deshalb einfach vor die Button-Variable ein Global gesetzt und dann hat es geklappt.
    Wenn du das meinst :D

    mfg Yellow

    §1 Ich kann nicht für meine scripts inhaftiert werden, auch wenn bereits 3 Menschen erblindeten an den Folgen der Korrekturlesung.  8o

  • Danke.. Global hilft nix.

    Und Autolaser
    Wie genau sollte ich mit GuiSetState über ein zweites Script ein unsichtbares Form eines anderen Scripts sichtbar machen ?(
    Hast du dir die Beispiele und meinen Problemschilderungs-Text angeschaut? hust ^^

  • Hi,
    wie soll denn auch eine GUI bedienbar sein, wenn GuiSetState() fehlt?

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Form1 = GUICreate("Test Test Test", 230, 118, 192, 124)
    $Button1 = GUICtrlCreateButton("Klick mich!", 60, 34, 125, 49, $WS_GROUP)
    guisetstate()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    MsgBox(0,"","Erfolg")
    EndSwitch
    WEnd

    [/autoit]
    Zitat

    Hast du dir die Beispiele und meinen Problemschilderungs-Text angeschaut? hust

    ja, hat er, und dir auch die Lösung genannt,aber du warst nicht in der Lage das umzusetzen *hust hust hust*

  • wie soll denn auch eine GUI bedienbar sein, wenn GuiSetState() fehlt?


    Heißt dass, dass das, was ich machen will (eine versteckte GUI erzeugen und per 2. Script sichtbar machen) nicht funktioniert?

    Denn GuiSetState() erzeugt ein sichtbares Fenster, und mit GuiSetState(@SW_HIDE) hab ich wieder das übliche Problem.

    ja, hat er, und dir auch die Lösung genannt,aber du warst nicht in der Lage das umzusetzen *hust hust hust*


    Genau wie deine "Lösung" ist seine aber exakt das Gegenteil von dem was ich gefragt habe. Ihr gebt mir alle als "Lösung" die GUI im ersten Script sichtbar zu machen, statt per zweitem, was aber halt meine Frage ist.

    Ansonsten will ich nicht zicken, nur darauf hinweisen, dass ihr irgendwie am Thema vorbei seid .. darf man ja wohl noch ohne aufgezogen zu werden?!

    Einmal editiert, zuletzt von klischee (7. April 2012 um 14:03)

  • mit

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Form1 = GUICreate("Test Test Test", 230, 118, 192, 124)
    $Button1 = GUICtrlCreateButton("Klick mich!", 60, 34, 125, 49)
    guisetstate(@sw_show)
    guisetstate(@SW_MINIMIZE)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    MsgBox(0,"","Erfolg")
    EndSwitch
    WEnd

    [/autoit]

    und

    [autoit]

    winactivate("Test Test Test")

    [/autoit]

    gehts

  • Danke, dass wäre ein Workaround, wenn auch mit Nachteilen (Fenster flackert auf, der Fokus wird verändert, kann also den Benutzer unterbrechen) die in meinem Fall zu unpraktibal sind.

    Ich habe zwischenzeitlich einen eigenen Workaround gemacht, und zwar verändere ich den Titel des versteckten Fensters mit dem 2. Script, was vom 1. Script erkannt wird, und diese ändert dann den Titel zurück und setzt die GUI auf Show. Also:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $title = "Test Test Test"
    $Form1 = GUICreate($title, 230, 118, 192, 124)
    Global $Button1 = GUICtrlCreateButton("Klick mich!", 60, 34, 125, 49, $WS_GROUP)

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

    While 1
    If StringInStr(WinGetTitle($Form1),"xxx") Then
    WinSetTitle($Form1,"",$title)
    GUISetState(@SW_SHOW,$Form1)
    EndIf
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    MsgBox(0,"","Erfolg")
    EndSwitch
    WEnd

    [/autoit] [autoit]

    $title = "Test Test Test"
    WinSetTitle($title,"",$title & "xxx")

    [/autoit]


    Dafür hat mein Workaround natürlich das Problem dass er nur wirkt wenn das erste Script in der Hauptschleife ist.

    Insofern hoff ich weiter auf eine richtige Lösung.. das komische ist ja nämlich, dass man in meinem ersten Beispiel die GUI zb ber "X" schließen kann, nur der Button reagiert halt nicht. Vielleicht muss man mit dem noch irgendwas anstellen?

    2 Mal editiert, zuletzt von klischee (7. April 2012 um 15:02)

  • [autoit]

    While 1
    if winactive("Test Test Test") then guisetstate(@sw_show)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    MsgBox(0,"","Erfolg")
    EndSwitch
    WEnd

    [/autoit]


    und

    [autoit]

    winactivate("Test Test Test")

    [/autoit]
  • Danke wieder. WinActivate gefällt mir aber nicht... auch die Kommunikation über zwei Scripte nervt, weil man nie weiß, wo ein anderes Script grad ist.

    Ich hab's jetzt so gelöst, dass das erste Script einfach das Fenster transparent macht, das zweite es wieder intransparent:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $title = "Test Test Test"
    $Form1 = GUICreate($title, 230, 118, 192, 124)
    Global $Button1 = GUICtrlCreateButton("Klick mich!", 60, 34, 125, 49, $WS_GROUP)

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

    WinSetTrans($Form1,"",0)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    MsgBox(0,"","Erfolg")
    EndSwitch
    WEnd

    [/autoit][autoit]

    WinSetTrans("Test Test Test","",255)

    [/autoit]


    Auf die Weise klappt es super ohne dass das erste Script noch mal reagieren müsste.