Checkbox aus vorhandener GUI auslesen / setzen

  • Hallo Forum,

    Ich habe zu der Thematik jetzt schon eine Weile gegoogelt und bestimmt auch 4-5 Beispiele dazu gefunden, aber so recht will es bei mir nicht klappen, zumal sich die meisten Beispiele auf eine eigene mit AutoIT erstellte GUI beziehen und die Ausgangslage dort irgendwie einfacher ist, da man die Checkbox selbst erstellt hat und diese dann meist einen eigenen Namen hat...

    Ich möchte im Prinzip "nur" eine Checkbox aus einer bereits vorhandenen GUI auslesen bzw. setzen können. Mein Ansatz war der folgende:

    AutoIt
    If GUICtrlRead(343) =  Not 1 Then
    	GUICtrlSetState (343, 1)
    ElseIf GUICtrlRead(343) = 1 Then
    	continue ...
    EndIf

    Ich versuche die Checkbox mit GUICtrlRead() abzugreifen und die ID, welche ich mit dem AutoIT Window Info Tool ausgelesen habe als Parameter mitzugeben... Was mache ich falsch?

    Screenshot vom Window Tool... (die angezeigten Werte ist die Checkbox... obwohl dort Class Button steht..):
    http://www.fotos-hochladen.net/view/checkboxyr5s1d8a2z.png
    checkboxyr5s1d8a2z.png

    Ich hab das ganze mal getestet und im Prinzip funktioniert weder das auslesen noch das setzen... :rolleyes:
    Viele Beispiele im Netz basieren dann auf Variabeln mit $Checkbox1 usw, welche man aber nur zur Hand hat, wenn man die Checkbox zuvor selbst erstellt hat. So wie ich das verstehe muss ich aber ja mit der ID als Parameter arbeiten?

    Großes Danke im Voraus!

    Edit Oscar: Bitte solche Bilder direkt hier im Forum (Dateianhänge) hochladen. Ich habe das oben mal eingefügt. Die Bilder auf den externen Foto-Upload-Seiten bleiben meist nicht lange verfügbar oder werden durch (nervende) Werbung finanziert.

    Einmal editiert, zuletzt von Oscar (24. Februar 2017 um 11:00)

    • Offizieller Beitrag

    Checkbox ist ein Button. ^^
    Und für fremde Fenster gelten keine GUI-Befehle, sondern Window-Befehle.

  • Hallo BugFix,

    danke für deine schnelle Hilfe. Das hat soweit super geklappt, ich konnte mit dem Code checked überprüfen, checken und unchecken, alles super.

    Komischerweise laufe ich nun aber vor folgenden Fehler: Ein Fenster weiter ist abermals eine Checkbox, welche Instance 1 hat. Diese kann ich weder korrekt auslesen (wird als 0 ausgelesen obwohl sie checked ist), noch kann ich diese unchecken und wieder checken...

    Ich hatte natürlich überlegt ob es daran liegt dass die gleiche Instance ein Schritt zuvor unchecked wird. Das würde zwar theoretisch erklären dass sie mit 0 statt 1 ausgelesen wird, aber das ganze müsste ja durch ein erneutes Schreiben in unterschiedliche iResult Variablen abgefangen werden können... (Verwende jetzt pro Fenster iResult 1, iResult2, usw...).

    Irgendeine Idee? Das Handle des Fensters hatte ich natürlich auch entsprechend angepasst. Nur das erste Wort im Titel ist gleich.

    Folgend der Code: In Fenster 2 funktioniert alles, in Fenster 3 wird iResult4 als "0" ausgelesen...:

    Einmal editiert, zuletzt von Simon09 (24. Februar 2017 um 11:53)

    • Offizieller Beitrag

    Wenn du WinWaitActive verwendest, bekommst du sowieso das Handle zurück:

    AutoIt
    ; statt:
    $sTitle = "Arbeitsplatzaktualisierung - Aktualisierung"
    $hWnd = WinGetHandle($sTitle)
    WinWaitActive($sTitle)
    
    
    ; verwende:
    $sTitle = "Arbeitsplatzaktualisierung - Aktualisierung"
    $hWnd = WinWaitActive($sTitle)

    Hast du eventuell eine Option gesetzt, dass Fenster auch mit Teilen des Namens erkannt werden und somit das falsche Fenster ermittelt wird?

  • Zumindest nicht bewusst, das wäre jetzt auch mein Überlegungsansatz gewesen dass das falsche Fenster ermittelt wird. Ich dachte das wird durch das komplette Ausschreiben des Titels quasi verhindert. Würde es klappen nur den letzten (sich ändernden Teil) des Titels anzugeben oder funktioniert das ganze dann nicht mehr?

    edit: Ansonsten hätte ich ja die IDs der Checkboxen zur Hand. Kann ich diese mit ControlCommand auch als Parameter verwenden anstatt die Instance? Wie würde eine Zeile dann aussehen?

    Einmal editiert, zuletzt von Simon09 (24. Februar 2017 um 12:15)

  • Also z.B. so?:


    AutoIt
    ControlCommand($hWnd, '', '[CLASS:Button;346]', 'Check', '')

    Oder wie genau lautet die ID-Syntax? Wo genau muss ich die Option hinsetzen?

    Sorry für die Anfängerfragen, ich hab AutoIT seit Ewigkeiten nicht mehr angeschaut.

  • Danke. Gut zu wissen dass die IDs oft dynamisch sind. Ich hätte vermutet dass dies die genauste Art der Ansteuerung ist... Das muss ich auf jeden Fall im Auge behalten falls sich z.B. mal die Anzahl der Checkboxen in der Maske unter bestimmten Voraussetzungen ändert.

    Edit: Verrückt, wenn ich mit ID arbeite wird die Checkbox ebenfalls als 0 ausgelesen... Irgendeine Idee?

    Einmal editiert, zuletzt von Simon09 (24. Februar 2017 um 12:48)

    • Offizieller Beitrag

    Es gibt optional die Möglichkeit Textelemente des Fensters/Controls zur Erkennung heranzuziehen (der 2.te Parameter, wo wir immer die schönen Leerstrings setzen :P ). Kannst das mal testen.
    Lass dir auf jeden Fall alle Handle, die du ermittelst in die Konsole ausgeben, prüfe rückwärts, ob das richtige Fenster erwischt wurde (WinGetTitle($hWnd))