Navigieren in Baumstruktur

  • Hallo,
    möchte ein Programm ansprechen das in der Navigation eine Baumstruktur hat, wie im Explorer. Mit welchem Befehl kann ich die einzelnen Menüpunkte und Untermenüs ansprechen? Es gibt keine ControlID.
    Gruß
    mactoni

    • Offizieller Beitrag

    Hi,

    hier ein Bsp:

    [autoit]

    #include <A3LTreeView.au3>

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

    Opt("WinTitleMatchMode", 4)

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

    ;Hier den Namen des Eintrages eintragen
    $Eintragsname = "PCI-BUS"

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

    Run("RUNDLL32.exe devmgr.dll DeviceManager_Execute")

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

    WinWaitActive("[CLASS:MMCMainFrame; INSTANCE:1]")
    Sleep(250)
    $winhandle = WinGetHandle("[CLASS:MMCMainFrame; INSTANCE:1]")
    $treehandle = ControlGetHandle($winhandle, '', "SysTreeView321")
    ControlFocus($winhandle, '', $treehandle)
    $nodehandle = _TreeView_FindNode ($treehandle, $Eintragsname)
    _TreeView_Select ($treehandle, $nodehandle)

    [/autoit]

    So long,

    Mega

  • Danke für die Antowrt aber ich versteh das komplette Script nicht :(
    Kannst du mir ein paar Erläuterungen geben? (blutiger Anfänger)

  • Ich glaube wegen dieses Beispieles übernehme ich jetzt mal... ;)

    Aaalso.
    Standardmäßig bietet AutoIt keine direkte Möglichkeit mit TreeViews umzugehen.
    Für diesen Zweck hat Paul Campbell (ist das so richtig?) eine "Erweiterung" für AutoIt geschrieben welche Windows-API-Funktionen nutzt.
    Also quasi die Befehle die Windows selbst verwendet um mit TreeViews umzugehen.
    Diese müsstest du dir erstmal >>hier<< herunterladen und installieren.

    Damit stehen uns nun weitere Funktionen zur Verfügung welche wir für unser TreeView nutzen wollen.

    Windows benötigt um mit TreeViews umzugehen nicht die Control-ID sondern ein Handle.
    Dies ist eine Kennung für z.B. Controls welche beim Erstellen immer neu vergeben werden.
    Diese dienen Windows dazu alle vorhandenen Controls zu unterscheiden.
    Diese bekommt man mit AutoIt aber relativ leicht heraus - nämlich über Controlgethandle() - ebenso mit Window-Handles - auch wenn es zugegeben hier nicht unbedingt notwendig ist).

    Jedenfalls haben wir dann ein Handle zu unseren Tree-View.
    Wir wollen aber einen einzelnen Eintrag daraus ansprechen.
    Die Einträge in unserem Tree-View sind ebenfalls eindeutig zugeordnet - die werden einfach von 0 aufwärts durchnummeriert.

    Um jetzt also einen Eintrag aus dem Tree-View anzusprechen brauchen wir lediglich das Control-Handle des Tree-View-Controls und seinen Index (hier im Skript als $NodeHandle bezeichnet).

    Hier in diesem Beispiel ist es so das wir ein Item von dem wir lediglich den Text kennen markieren wollen.
    Dazu müssen wir erst einmal seinen Index herausbekommen.

    Nach einem kurzen Blick in die Hilfe der AU3Lib erfahren wir das es dafür eine Funktion namens "_TreeView_FindNode" gibt.
    Diese benötigt als Parameter das Control-Handle (haben wir dort schon ausgelesen) und den Text nach dem gesucht werden soll.
    Was wir als Rückgabewert bekommen ist der Index des Eintrages.
    Damit können wir die Funktion "_TreeView_Select" füttern welche uns den Eintrag markieren soll - diese benötigt als Parameter das Control-Handle und den den Index des Eintrages - fertig.

    Ich hoffe das macht das ganze erst einmal ein bisschen verständlicher.

  • Bekomme es nicht zum laufen ;(

    $treehandle = ControlGetHandle($winhandle, '', "SysTreeView321")

    wo kommt bei Xenobiologist Bsp. hier "SysTreeView321" her?? Habe mit Info alle ID´s gecheckt bei aber dies nicht gefunden. Sein Bsp. läuft bei mir, aber wenn ich versuche es auf mein Programm anzuwenden tut sich nichts.
    Finde den Fehler nicht

  • Gibt es eine Möglichkeit zu testen bis wohin das script funktioniert? sitze jetzt fast 8h am diesem sch.... und hab langsam keine Lust mehr

  • Ist quasi wie deins, außer den anpassungen an die Software die damit angesprochen werden soll:

    [autoit]

    #include <A3LTreeView.au3>

    Opt("WinTitleMatchMode", 4)

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

    $targetname = "8001"

    Run("C:\Programme\xxxxxxxxxx.exe")
    Sleep(1000)
    Send("!p")
    Send("{DOWN}")
    Send("{ENTER}")
    Sleep(250)
    Send("{DOWN}")
    Sleep(250)
    Send("{ENTER}")
    Sleep(500)
    Send("{ENTER}")


    WinWaitActive("[CLASS:ThunderRT6FormDC; INSTANCE:1]")
    Sleep(250)
    $winhandle = WinGetHandle("[CLASS:ThunderRT6FormDC; INSTANCE:1]")
    $treehandle = ControlGetHandle($winhandle, '', "TreeView20WndClass1")
    ControlFocus($winhandle, '', $treehandle)
    $nodehandle = _TreeView_FindNode ($treehandle, $targetname)
    _TreeView_Select ($treehandle, $nodehandle)

    [/autoit]

    Was ist consolewrites?

  • Zitat

    Original von mactoni
    wo kommt bei Xenobiologist Bsp. hier "SysTreeView321" her??

    Das ist der ClassName + die Instance - alle beide mit dem AutoIt-Window-Info-Tool ausgelesen.
    Der Classname ist "SystreeView32" die Instance ist "1" - beides zusammen ergibt die ClassNameNN.

    Man könnte das vielleicht mal testen wenn man den Namen des zu automatisierenden Programms hätte.

  • Hab jetzt mal mit ControlWrite ausgelesen:

    $winhandle gibt :0x000A05A2 zurück
    $treehandle gibt nichts zurück
    $nodehandle gibt dann die 0 zurück

    Nehme an dann liegt der Fehler in dieser Zeile:

    Code
    $treehandle = ControlGetHandle($winhandle, '', "TreeView20WndClass1")


    AspirinJunkie
    Das Programm das gesteuert wird ist kein Kaufprogramm sondern eine spezielle Software für eine spezielle Anwendung. Ich muss mich hier durch die Baumstruktur hangeln um verschiedene Daten einzugeben. Dies möchte ich mit autoIt automatisieren da es ca. 6000 Einträge sind die sonst per Hand eingegeben werden müssen.

  • Was sagt denn Window-Info über das TreeView-Control (Classname, Instance etc.)

    Überprüfe auch mal ob die Control-ID des TreeView bei jedem Neustart des Programm immer gleich ist - dann könntest du auch einfach diese nehmen - dann aber ohne Anführungszeichen)

  • Hm - deine Parameter in der Zeile sind lt. Window-Info-Tool in Ordnung.
    Du kannst nochmal so geschrieben probieren - ist im Prinzip aber auch nur das selbe:

    [autoit]

    $treehandle = ControlGetHandle($winhandle, '', "[CLASS:TreeView20WndClass; INSTANCE:1]")

    [/autoit]

    Kann es sein das es zu dem Zeitpunkt mehrere Fenster gibt welche dieser Klasse entsprechen?

    Überprüfe das mal gegebenenfalls z.b. so:

    [autoit]

    Opt("WinTitleMatchMode", 4)

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

    $WinList = WinList("[CLASS:ThunderRT6FormDC]")
    MsgBox(0,"", "Anzahl an Windows mit angegebener Klasse:" & @CRLF & @CRLF & $WinList[0][0])

    [/autoit]

    Könnte ja vielleicht sein das wir uns im falschen Fenster befinden... ;)

  • wenn ich den Fenstercheck ans Ende vom Script setzte sind es 2 Fenster einer Klasse

  • Gut - dann teste nochmal deine Rückgabewerte in dem du die Wingethandle-Zeile folgendermaßen abänderst:

    [autoit]

    $winhandle = WinGetHandle("[CLASS:ThunderRT6FormDC; INSTANCE:2]")

    [/autoit]

    Ansonsten würde ich in diesem Fall eher dazu raten auch den Fenstertitel als Vergleichskriterium mit einzubeziehen und außerdem als 2. Parameter noch zusätzlich einen Teil vom Fenstertext - denn nur der Klassenname reicht hier ja, wie wir sehen, nicht aus da es mehrere Fenster dieser Klasse gibt.