Fenster im Hintergrund bedienen

  • Hi Leute,
    ich arbeite gerade an einem Mod Tool für ein etwas älteres Spiel (Siege of Avalon) und bin dabei auf ein Problem gestoßen:
    Ich will dem Nutzer die Möglichkeit geben, die Mods zu installieren, selbst wenn er nicht Siege of Avalon besitzt.
    Das erste Kapitel von Siege of Avalon gibt es legal kostenlos zum Download und dieses wird auch für die Mods benötigt.
    Ich will jedem Nutzer die Möglichkeit bieten, diese Mods zu spielen, deshalb habe ich die Möglichkeit der Installation von Siege of Avalon in meinen Mod-Tool Installer integriert.
    Das Problem ist, dass die einzelnen Spieldateien nur von dem Installer installiert werden dürfen. Wenn man die Dateien anderweitig weitergibt verstößt dies gegen die Lizenzbedingungen.
    Also habe ich ein kleines Programm programmiert, welches im Installer die entsprechenden Boxen anklickt.
    Jedoch darf man, während das Programm klickt, den PC nicht bedienen, das ist ein Handicap.
    Wie kann ich es hinbekommen, dass das Programm im Hintergrund die entsprechenden Dinger anklickt?
    Ich habe unter anderem ein kleines Edit-Feld, in welches eine Variable eingetragen wird (Installations-Path), das sollte möglichst auch im Hintergrund laufen.
    Vieleicht wisst ihr eine Lösung
    Mfg Fliwatt

  • Wenn du einen Mod hinbekommst dann kennst du sicher Blockinput.

    Damit kannst du dem Nutzer für den Zeitraum der Installation das Recht des eingebens entziehen. So kann er dein Skript nicht stören.

  • Unsinn, warum sollte controlClick das nicht erlauben, genau dafür ist es da.

    Beispiel:

    myTool.au3

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("MyTool", 451, 191, 192, 124)
    $Button1 = GUICtrlCreateButton("installieren", 160, 72, 75, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    install()
    EndSwitch
    WEnd

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

    Func install()
    run(@ScriptDir & "\setup.exe") ; vorher setup.au3 kompilieren...
    Do
    Sleep(10)
    Until WinExists("Setup Window blabla")
    WinSetState("Setup Window blabla","",@SW_HIDE)

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

    Sleep(2000) ; nur zu demo zwecken

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

    ControlClick("Setup Window blabla","","[CLASS:Button; INSTANCE:1]") ; 1. checkbox anhaken
    ControlSetText("Setup Window blabla","","[CLASS:Edit; INSTANCE:1]","neuer pfad") ; pfad ändern
    Sleep(10) ; setup braucht kurz zeit um den button zu aktivieren, sonst kann er nicht geklickt werden
    ControlClick("Setup Window blabla","","[CLASS:Button; INSTANCE:2]") ; weiter button klicken

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

    Sleep(2000) ; nur zu demo zwecken
    WinSetState("Setup Window blabla","",@SW_SHOW) ; sichtbar machen, siehe da alles wurde korrekt gesetzt
    EndFunc

    [/autoit]

    setup.au3

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Setup Window blabla", 373, 259, 192, 124)
    $Checkbox1 = GUICtrlCreateCheckbox("option 1", 120, 72, 97, 17)
    $Button1 = GUICtrlCreateButton("weiter", 112, 192, 75, 25)
    GUICtrlSetState($Button1, $GUI_DISABLE)
    $Checkbox2 = GUICtrlCreateCheckbox("option 2", 120, 104, 97, 17)
    $inputPath = GUICtrlCreateInput("bitte pfad eingeben", 112, 144, 121, 21)
    $Label1 = GUICtrlCreateLabel("OK", 256, 144, 19, 17)
    GUICtrlSetState($Label1,$GUI_HIDE)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    case $Button1
    MsgBox(0,"setup msg","installation fertig!")
    EndSwitch

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

    If GUICtrlRead($inputPath) <> "bitte pfad eingeben" Then
    If BitAND(GUICtrlGetState($Button1), $GUI_DISABLE) = $GUI_DISABLE Then
    GUICtrlSetState($Button1,$GUI_ENABLE)
    GUICtrlSetState($Label1,$GUI_SHOW)
    EndIf
    EndIf

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

    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Welches Datum und Uhrzeit Fenster? Wenn du hier Hilfe erwartest wäre zumindestens mal ein Link zu diesem Setup sinnvoll oder alternativ auch mal ein au3info summary log des Fensters/Controls das du manipulieren willst.

  • Der Downloadlink funktioniert bei mir weder im Firefox noch im IE. Da poppt nur ein leeres Fenster auf. ?(


    Das wird in allen Browsern passieren. Ich habe über ein FF-Addon versucht den Download bei virustotal.com zu prügen lassen. Resultat:

    Zitat

    {"result": 0, "verbose_msg": "Invalid URL"}

    mfg autoBert

  • Hab es noch mal hochgeladen
    LINK
    Window Info Summary

    Spoiler anzeigen


    Der Text ist nicht mehr aktuell, das erste Kapitel wurde kostenlos zur Vervielfältigung freigegeben
    Fliwatt

  • Und das Problem liegt nun wo? Funktioniert absolut einwandfrei, zumindestens bei sichtbarem Fenster, aber für die control Funktionen spielt es wie gesagt keine Rolle ob das Fenster sichtbar oder unsichtbar ist, siehe Beispiel oben.
    Im Anhang findest du alle Au3Info Logs die man braucht, also zumindestens bis zu dem Schritt bei dem ich nun erstmal abgebrochen habe.


    Spoiler anzeigen
    [autoit]


    $setup = @ScriptDir & "\SoACH1b_bi2a.exe"

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

    Run($setup)

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

    Do
    Sleep(10)
    Until WinExists("Windows NT not supported","This game is not officially supported on the Windows NT platform")

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

    ; 1. button ok
    ControlClick("Windows NT not supported","","[CLASS:Button; INSTANCE:1]")

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

    Do
    Sleep(10)
    Until WinExists("Willkommen","Willkommen im Installationsprogramm für Siege of Avalon Chapter 1")

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

    ; 2. button weiter
    ControlClick("Willkommen","","[CLASS:Button; INSTANCE:1]")

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

    Do
    Sleep(10)
    Until WinExists("Zielpfad wählen","Installation speichert Siege of Avalon Chapter 1")

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

    ; 3. button pfad wählen
    ControlClick("Zielpfad wählen","","[CLASS:Button; INSTANCE:5]")

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

    Do
    Sleep(10)
    Until WinExists("Zielverzeichnis wählen","")

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

    ; 4. edit Zielpfad einfügen
    ControlSetText("Zielverzeichnis wählen","","[CLASS:Edit; INSTANCE:1]","F:\testFolder")
    ; 5. button ok
    ControlClick("Zielverzeichnis wählen","","[CLASS:Button; INSTANCE:1]")

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

    Do
    Sleep(10)
    Until Not WinExists("Zielverzeichnis wählen","")

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

    ; 6. weiter Button
    ControlClick("Zielpfad wählen","","[CLASS:Button; INSTANCE:1]")

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

    Do
    Sleep(10)
    Until WinExists("Installation beginnen","Sie sind jetzt zur Installation von Siege of Avalon Chapter 1")

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

    ; 7. letzter weiter button?
    MsgBox(0,"Fertig?","hier würde dann noch der hoffentlich letzte weiter button kommen, das bekommste aber wohl selber hin...")

    [/autoit]
  • Du kannst praktisch jeden Installer mit Tastaturbefehlen durchlaufen.
    Vielleicht fällt es dir ja leichter das ganze mit ControlSend() umzusetzen, da brauchst du im Prinzip nicht mal die IDs kennen sondern nur deine Tastendrücke in richtiger Reinfolge (TAB, Enter, Leertaste zum anhacken). Hab damit schön des öfteren Fenster ferngesteuert die nicht aktiv waren.

    Gruß
    stro