Anfänger braucht Hilfe bei DropDown Listen

  • Hallo,

    ich bin der Uwe, 55 Jahre alt und habe keine Erfahrung was Programmierung, Skripte etc betrifft. Ich möchte mit AutoIt in einer DropDown Liste eigentlich einfach nur einen Eintrag auswählen. Eigentlich ... :)


    Ich bin mit Windows 10 unterwegs und möchte in der Soundeinstellung unter Aufnahme beim Realtek Stereomix (Bild 1) eine Quelle auswählen. Nach langem Suchen und Lesen habe ich in einem Forum ein Skript gefunden und dies mit Trial und Error versucht an meine Bedürfnisse an zu passen.


    Checkbox setzen und einen Eintrag in einer anderen DropDown Liste (Bild 3) auswählen klappt wunderbar, nur in dieser DropDown Liste (Bild 2) will es einfach nicht klappen. Es wird nichts ausgewählt bzw. gesetzt. Ich bin ratlos und könnte etwas Hilfe gebrauchen.

    Laut AutoIt Window Info unterscheiden sich beide Listen nur in der ID. Liste die nicht klappt hat die ID 1600 (Bild 1a) und die Liste die klappt hat die ID 1410 (Bild 3a). Sonst kann ich keine Unterschiede finden. Wie im Quellcode zu sehen ist, habe ich mehrere Sachen ausprobiert. Sorry, ich weiß nicht weiter.


    Mit freundlichen Grüssen

    Uwe

  • Hallo Uwe und herzlich willkommen im AutoIt.de-Forum!


    Du benutzt als Fenstertitel immer [CLASS:#32770] und das kann so nicht gutgehen, da sowohl das Fenster "Sounds" als auch die "Eigenschaften" die selbe Klassennummer haben.

    (wie der Soundmixer unten rechts im Traymenu und tausend andere Programme auch)


    Also solltest du lieber das Fenster mit seinem Titel identifizieren um Duplikate zu vermeiden.

    Kopier dir die Titel aus dem Window Info Tool heraus und füg sie dort ein, du brauchst auch keine Advanced Identifier wie [TITLE:Blabla] zu nutzen. Blabla reicht vollkommen.

    Der Titel sollte aber linksvollständig sein (anpassbar mit der Opt: WinTitleMatchMode), da AutoIt ihn sonst nicht findet.


    Des Weiteren solltest du es vermeiden die Option "WinWaitDelay" so oft zu setzen, da sie nur einmal gesetzt werden muss und dieser Wert genommen wird bis er überschrieben worden ist.


    Da du bereits die ControlSend/GetText/...-Funktionen verwendest würde ich es dir auch anraten für das wechseln zwischen den Tabseiten ebenfalls ControlCommand zu nutzen.

    Es kann sein, dass, während dein Skript läuft, ein anderes Fenster auftaucht und dann würden deine Send-Befehle dorthin gesendet werden statt an das ursprüngliche Fenster.

    Dazu kannst du als Befehl TabLeft respektive TabRight verwenden.


    Du kannst ja die Anpassungen mal vornehmen und uns berichten ob es funktioniert :)

  • Hallo alpines,

    erstmal danke für deine Hilfe. Habe deine Vorschläge umgesetzt. Beim Fenstertitel musste ich an einigen Stellen [CLASS:#32770] stehen lassen, da sonst das Fenster nicht geschlossen wurde. K.A. warum. WinWaitDelay habe ich jetzt nur noch einmal drin. Mit den Tabseiten muss ich mich dann nochmal beschäftigen, hat so auf Anhieb nicht funktioniert. Sorry, ist halt alles neu für mich. Leider funktioniert das Skript immer noch nicht. Im TAB "Abhören" die Auswahl in der DropDown Liste nicht. Im TAB "Erweitert" klappt die Auswahl in der DropDown Liste. Dumm ist nur ich benötige die Auswahl im "Abhören" TAB. Die andere ist nur zu Testzwecken. Ich weiß nicht mehr weiter.


  • Ich nochmal. ControlCommand ("[CLASS:ComboBox]", "", 1600, "SelectString", "Lautsprecher (GameDAC Game)") habe ich durch ControlCommand ("[CLASS:#32770]", "", 1600, "SelectString", "Lautsprecher (GameDAC Game)") ersetzt. Ändert leider auch nichts.

  • Zu [CLASS:#32770]

    https://docs.microsoft.com/de-…nmsg/about-window-classes

    --> #32770 The class for a dialog box.


    Zu WinWait("[CLASS:#32770]")

    Damit wartest du - im schlimmsten Fall unendlich lange - auf eine DialogBox, egal von welchem Programm, egal welcher Titel und alles Andere ist auch egal... nur die Klasse muss stimmen.

    Stricken wir das mal etwas um und wartet nicht auf ein Fenster, sondern auf einen Zug der DB...

    ZugWait("[CLASS:ICE]")

    Damit wartest du - im schlimmsten Fall unendlich lange - auf einen Zug, egal von wo er kommt, egal wohin und wann er fährt und alles Andere ist auch egal... es muss nur ein ICE sein.

    Und wenn er nicht gestorben ist, wartet er heute noch auf seinen Zug... 8o

    So ist es um Klassen besser: (Klassen...:rofl:)

    Code
    Local $hWnd = WinWait("[TITLE:Sound; CLASS:#32770]", "Wählen Sie ein Aufnahmegerät aus, um die Einstellungen zu ändern:", 10) ; Max. 10 Sekunden auf das Fenster warten
    If Not IsHWnd($hWnd) Then Exit 1
    ConsoleWrite("$hWnd --> " & $hWnd & @CRLF)
    Local $idCtrl = 1000, $sText = "", $hCtrl = ControlGetHandle($hWnd, $sText, $idCtrl) ; oder einfach ControlGetHandle($hWnd, "", 1000)
    If Not IsHWnd($hCtrl) Then Exit 2
    ConsoleWrite("$hCtrl --> " & $hCtrl & @CRLF)
    ; ...


    Zu Opt("WinWaitDelay", 1000)

    EN: Alters how long a script should briefly pause after a successful window-related operation. Time in milliseconds to pause (default=250).

    DE: Ändert, wie lange ein Skript nach einem erfolgreichen Fenstervorgang kurz anhalten soll. Zeit in Millisekunden bis zum Anhalten (Standard = 250).

    Nach dem Setzen einer Option, ist sie solange gültig, bis sie an anderer Stelle wieder geändert wird. Es gibt aber auch Optionen, bei denen eine nachträgliche Änderung wenig bis keinen Sinn macht, so z. B. Opt('MustDeclareVars', 1). Einige Optionen, wie z.B. Opt("WinTitleMatchMode", 1) werden oftmals innerhalb von Funktionen geändert und vor Verlassen der Funktion wieder auf den vorherigen Wert gesetzt.

  • Hallo Bitnugger,

    danke für den Hinweis. Wie gesagt, alles Neuland für mich. Nur löst das mein Problem nicht. Warum klappt die automatische Auswahl in der DropDown Liste ID 1410 im TAB "Erweitert" und in der DropDown Liste ID 1600 im TAB "Abhören" nicht? Für beide Listen benutze ich die gleiche Vorgehensweise. Ist mir ein Rätsel. Ich möchte einfach nur beim Benutzer Login automatisch in der DropDown Liste im TAB "Abhören" das Gerät "Lautsprecher (GameDAC Game)" setzen.