bei CheckListBox Checkstatus auslesen oder setzen

  • Hi.

    Ich bin mit meiner automatischen PC-Einrichtung jetzt fast fertig. Nun möchte ich den Code nochmal durch gehen und das mittlerweile gelernte auch bei dem älteren Code anwenden. Immerhin bestand der Anfangscode fast ausschließlich aus Tastensimulationen.
    Ein großes anliegen ist mir dabei die Optimierung des Umgangs mit CheckListboxes. Bisher habe ich die List mit Tastenbefehlen abgearbeitet, was natürlich recht Fehleranfällig ist.
    Als "Problem" habe ich mir jetzt die Installation von Trackmania Nations Forever ausgesucht. Ich bräuchte irgendeine Möglichkeit,
    Checkboxen in der Checklistbox mit Sicherheit Ab- oder Anzuwählen (also nicht nur von Checked auf Unchecked oder zurück wechseln, sondern dass eben auch nix passiert, wenn die Box schon z.B. unchecked ist)
    Mir ist dabei egal, ob es schon eine fertige Funbktion wie bei ControlCommand mit check gibt, oder ob ich den Check-Status prüfe und bei bedarf den Checkstatus ändere.
    Ich habe jetzt seit gestern Abend gegoogelt aber leider nichts gefunden, dass mir weiter geholfen hat. Es wurde mehrmals auf
    - die Commands SetCurrentSelection, IsChecked und SelectString von ControlCommand
    - _GUICtrlListBox_GetCount
    - _GUICtrlListBox_GetSel
    verwiesen, aber mir haben die leider nicht weiter geholfen. Ich bekomme immer nur zurück, ob der entsprechende String markiert ist oder nicht.

    Es wäre schön, wenn ihr mir hier weiter helfen könnt.

    Einmal editiert, zuletzt von Mistil (2. August 2013 um 17:33)

  • Hm. OK.
    Dachte, der Begriff Checklistbox wäre klar, weil ich das in manchen Fragen schon gelesen habe.

    Das Skript wird euch wohl eher wenig helfen, weil es nur ein wenig rum probieren ist. Das eigentliche Skript steuert die Installation von Programmen, indem es den Installationsdialog automatisiert. Dabei kommt ein Fenster, in dem Checkboxen als ein einziges Control zusammengefasst werden. Es gibt also nur ein Handle für die Liste aus Checkboxes und nicht für jede Checkbox einzeln. Mein Problem ist jetzt, dass ich die Checkboxen gerne Checken oder Unchecken möchte, aber keine Ahnung habe, wie ich den momentanen Checkstatus berücksichtige.
    Controlcommand(..., ..., ..., "Check") geht nicht, weil ich die Checkboxen ja nicht direkt ansprechen kann.

    So weit bin ich bis jetzt:

    [autoit]

    #Include <GuiListBox.au3>
    #include <GuiListView.au3>

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

    Global $x = 1
    Global $y = 1
    Global $ContHandle=0

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

    WinActivate("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen")
    WinWaitActive("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen")
    $ContHandle=ControlGetHandle("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen", "TNewCheckListBox1")
    MsgBox(0, "", $ContHandle)
    $x=_GUICtrlListBox_GetCount($ContHandle)
    MsgBox(0, "", $x)
    $y=_GUICtrlListBox_GetText($ContHandle, 1)
    MsgBox(0, "", $y)
    ControlCommand("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen", "TNewCheckListBox1", "SelectString", $y)
    exit

    [/autoit]

    Die MsgBoxen sind für mich erstmal nur zur Überprüfung um zu wissen, ob die Variablen die richtigen Werte haben.
    Ab hier weiß ich leider nicht weiter. Wenn ich wenigstens ermitteln könnte, ob die Boxen checked sind oder nicht, könnte ich mich mit Tastensimulationen durchhanglen. Eine elegantere Lösung wäre natürlich noch schöner.
    Und ja, ich weiß, die Variablenbenennung ist nicht besonders elegant, aber die waren ursprünglich für Fensterpositionen deklariert und ich habe sie zum testen missbraucht.

    Im Anhang mal ein Screenshot vom Installationsfenster (Der schwarze Kasten ist zu sehen, weil ich gerade die AutoIt Window-Info benutzt habe. Es ist zusehen, dass die Checkboxen als 1 Control bbehandelt werden)
    Daneben könnt ihr sehen, was das Info-Tool über das Control zu sagen hat.

    • Offizieller Beitrag

    Dabei kommt ein Fenster, in dem Checkboxen als ein einziges Control zusammengefasst werden. Es gibt also nur ein Handle für die Liste aus Checkboxes und nicht für jede Checkbox einzeln.

    Im Allgemeinen, ist das Handle, das du bekommst, das des Parents. Die Checkboxen selbst sind Childs davon. Du kannst versuchen mit

    [autoit]

    _WinAPI_GetWindow($hWndParent, $GW_CHILD)

    [/autoit]

    die Handle der einzelnen Checkboxen abzufragen. Wenn das gelingt, kannst du sie auch bearbeiten.

  • hm ich habe folgendes versucht:

    [autoit]


    #include <WinAPI.au3>
    #include <Constants.au3>

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

    Opt("WinTitleMatchMode", 2)

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

    Local $hWndParent = ControlGetHandle("Customer", "", "[CLASS:wVantive; INSTANCE:7]")
    _WinAPI_GetWindow($hWndParent, $GW_CHILD)

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

    ConsoleWrite($GW_CHILD)

    [/autoit]
    • Offizieller Beitrag

    Wie wär es, wenn du dir einfach mal in der Hilfe anschaust, wie die Funktion arbeitet? Du musst natürlich den Rückgabewert auffangen. :wacko:
    Wenn du das erste Child-Handle hast, suchst du mit demselben Befehl (aber andererem Flag) die Geschwister-Handle des Childs.

    [autoit]

    _WinAPI_GetWindow

    [/autoit]
  • oh man bin ich ein Depp.

    ...........................................________
    ....................................,.-'"...................``~.,
    .............................,.-"..................................."-.,
    .........................,/...............................................":,
    .....................,?......................................................,
    .................../...........................................................,}
    ................./......................................................,:`^`..}
    .............../...................................................,:"........./
    ..............?.....__.........................................:`.........../
    ............./__.(....."~-,_..............................,:`........../
    .........../(_...."~,_........"~,_....................,:`........_/
    ..........{.._$;_......"=,_......."-,_.......,.-~-,},.~";/....}
    ...........((.....*~_......."=-._......";,,./`..../"............../
    ...,,,___.`~,......"~.,....................`.....}............../
    ............(....`=-,,.......`........................(......;_,,-"
    ............/.`~,......`-...................................../
    .............`~.*-,.....................................|,./.....,__
    ,,_..........}.>-._...................................|..............`=~-,
    .....`=~-,__......`,.................................
    ...................`=~-,,.,...............................
    ................................`:,,...........................`..............__
    .....................................`=-,...................,%`>--==``
    ........................................_..........._,-%.......`
    ...................................,

  • Schön, dass dir ein Licht aufgegangen ist :thumbup: . Ich bin leider noch nicht weiter.
    Ich habe jetzt mal folgendes versucht, bin mir aber noch nichtmal sicher, ob ich die Funktion richtig anwende.

    [autoit]

    #include <WinAPI.au3>
    #include <Constants.au3>

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

    Global $ContHandle
    Global $hBox

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

    WinActivate("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen")
    WinWaitActive("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen")
    $ContHandle=ControlGetHandle("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen", "TNewCheckListBox1")
    MsgBox(0, "", $ContHandle)
    $hBox=_WinAPI_GetWindow($ContHandle, $GW_CHILD)
    MsgBox(0, "", $hBox)
    exit

    [/autoit]

    Als Rückgabewert ($hBox) bekomme ich immer 0. Ich steige aber in der Erklärung auch nicht wirklich durch, was ich für $iCmd einsetzen muss (wenn ich Z-Anordnung lese, muss ich immer an Dragonball denken :huh: )
    Ich würde mal wie folgt vermuten und hoffe, dass es richtig ist und mein Fehler woanderst liegt:
    1. $hBox1=_WinAPI_GetWindow($ContHandle, $GW_CHILD)
    2. $hBox2=_WinAPI_GetWindow($hBox1, $GW_HWNDNEXT)
    ...

    Edit hat gemeint, ich soll noch die Includes ergänzen und die Variablen deklarieren. Hatte ich vergessen zu kopieren.

    Edit 31.7:
    Ich habe eben nochmal etwas mit der Funktion gespielt. Also angewandt habe ich sie wohl richtig. Ich bekomme die Handle nur so weit heraus, wie ich es auch mit dem Tool kann. versuche ich das Handle der nächten Child-Ebene zu bekommen, kriege ich 0 zurück.

    mit _GUICtrlListBox_GetCount() bekomme ich immerhin die korrekte Zahl an Childs in dem Kontrol heraus, kann mit _GUICtrlListBox_GetText() den entsprechenden String auslesen und die Boxen mit ControlCommand("", "", "", "SelectString") sogar markieren. Gibt es keine möglichkeit, da an zu setzen und die Boxen zu checken (bzw. das Handle heraus zu bekommen)? Nix gegen die WinAPI-Funktion, aber das scheint nicht zu funktionieren.

    3 Mal editiert, zuletzt von Mistil (31. Juli 2013 um 20:26)

  • So, ich habe es nochmal mit _GUICtrlListView_SetItemChecked versucht, bin mir aber so langsam nicht mehr sicher, ob nicht ich einen Fehler mache.

    [autoit]


    #include <GuiListView.au3>

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

    Global $ContHandle
    Global $wv

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

    WinActivate("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen")
    WinWaitActive("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen")
    $ContHandle=ControlGetHandle("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen", "TNewCheckListBox1")
    _GUICtrlListView_SetItemChecked($ContHandle, 1, True)
    $wv=_GUICtrlListView_GetItemChecked("$ContHandle", 1)

    [/autoit]


    Weder wird der Haken gesetzt, noch bekomme ich die richtige Aussage, ob die abgehakt sind oder nicht. Ich bekomme immer False.

    Einmal editiert, zuletzt von Mistil (1. August 2013 um 19:57)

  • Dass du das Handle übergeben musst ist dir klar oder? Du übergibst da nen String "$ContHandle" ^^

    [autoit]

    $wv=_GUICtrlListView_GetItemChecked($ContHandle, 1)

    [/autoit]

    Falls ja könntest du uns vllt einen Link zur Installationsdatei geben.
    Wird wohl schwer das zu lösen wenn man nur ins Blaue rät

  • gibt ControlGetHandle nicht das Handle des entsprechenden Controls zurück?
    Wenn ich die Variable $ContHandle in ner MsgBox anzeigen lasse, bekomme ich zumindest das gleiche Handle, wie vom WindowTool angezeigt.

    Jetzt hab ich den Fehler gesehen. Ist wohl beim rum probieren passiert. hab die Bezeichnung durch die Variable ersetzt und die Anführungszeichen übersehen. Es funktioniert aber trotzdem nicht.

    Ich würde die Datei ja anhängen, aber die hat 500MB. Denke mal nicht, dass das einer nur zum helfen runter laden will. falls sich doch jemand berufen fühlt, gibts die Datei Hier .

    Einmal editiert, zuletzt von Mistil (1. August 2013 um 22:25)

  • Ja, hab ich dann auch gesehen. Ist beim rumprobieren passiert. war aber wohl nicht das Problem

    Edit:

    Ich habe für mein problem zwar keine extra Funktion gefunden um es elegant zu lösen, habe jetzt aber eine Art workaround, das funktioniert. nachdem auf weiter geklickt wurde, werden die Strings der markierten Checkboxen im nächsten Fenster angezeigt. So kann ich kontrollieren, ob alle abgehakt waren und später auch bestimmte ausschließen.

    [autoit]


    #Include <GuiListBox.au3>
    #include <GuiListView.au3>

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

    Global $wv[4]
    Global $cont=1500
    Global $ContHandle=0
    Global $string=0

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

    while 1
    If WinExists("Setup - TmNationsForever", "Das Setup ist jetzt bereit") Then
    WinActivate("Setup - TmNationsForever", "Installation durchführen")
    WinWaitActive("Setup - TmNationsForever", "Installation durchführen")
    $wv[0]=WinExists("Setup - TmNationsForever", "Verknüpfung auf dem Desktop erstellen")
    $wv[1]=WinExists("Setup - TmNationsForever", "Dateien vom Typ '.gbx' mit TmNationsForever verknüpfen")
    $wv[2]=WinExists("Setup - TmNationsForever", "Das URL-Protokoll 'tmtp://' mit TmNationsForever verknüpfen")
    $wv[3]=WinExists("Setup - TmNationsForever", "Shell-Erweiterung für die Darstellung von '.gbx'-Thumbnails installieren")

    Select
    Case $wv[0]=0
    ControlClick("Setup - TmNationsForever", "Installation durchführen", "< &Zurück")
    WinWait("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen")
    WinActivate("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen")
    WinWaitActive("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen")
    $ContHandle=ControlGetHandle("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen", "TNewCheckListBox1")
    $string=_GUICtrlListBox_GetText($ContHandle, 1)
    ControlCommand("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen", $ContHandle, "SelectString", $string)
    sleep(100)
    send("{space}")
    sleep($cont)
    ControlClick("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen", "&Weiter >")
    Case $wv[1]=0
    ControlClick("Setup - TmNationsForever", "Installation durchführen", "< &Zurück")
    WinWait("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen")
    WinActivate("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen")
    WinWaitActive("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen")
    $ContHandle=ControlGetHandle("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen", "TNewCheckListBox1")
    $string=_GUICtrlListBox_GetText($ContHandle, 3)
    ControlCommand("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen", $ContHandle, "SelectString", $string)
    sleep(100)
    send("{space}")
    sleep($cont)
    ControlClick("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen", "&Weiter >")
    Case $wv[2]=0
    ControlClick("Setup - TmNationsForever", "Installation durchführen", "< &Zurück")
    WinWait("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen")
    WinActivate("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen")
    WinWaitActive("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen")
    $ContHandle=ControlGetHandle("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen", "TNewCheckListBox1")
    $string=_GUICtrlListBox_GetText($ContHandle, 4)
    ControlCommand("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen", $ContHandle, "SelectString", $string)
    sleep(100)
    send("{space}")
    sleep($cont)
    ControlClick("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen", "&Weiter >")
    Case $wv[3]=0
    ControlClick("Setup - TmNationsForever", "Installation durchführen", "< &Zurück")
    WinWait("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen")
    WinActivate("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen")
    WinWaitActive("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen")
    $ContHandle=ControlGetHandle("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen", "TNewCheckListBox1")
    $string=_GUICtrlListBox_GetText($ContHandle, 5)
    ControlCommand("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen", $ContHandle, "SelectString", $string)
    sleep(100)
    send("{space}")
    sleep($cont)
    ControlClick("Setup - TmNationsForever", "Zusätzliche Aufgaben auswählen", "&Weiter >")
    Case $wv[0]=1 And $wv[1]=1 And $wv[2]=1 And $wv[3]=1
    ControlClick("Setup - TmNationsForever", "Das Setup ist jetzt bereit", "&Installieren")
    ExitLoop
    EndSelect
    Else
    Sleep(100)
    EndIf
    WEnd

    [/autoit]

    Ist wie gesagt nicht elegant, aber es funktioniert.

    2 Mal editiert, zuletzt von Mistil (2. August 2013 um 17:42)