Externes Treeview auslesen

  • Hallo zusammen,

    ich versuche aus einem externen Windowsprogramm die Treeview auszulesen. Leider ohne Erfolg.

    Folgnde Infos erhalte ich über das TreeView:

    Window
    Titel: Service
    Class: _Rentive

    Controll:
    Class: TreeViewWndClass
    Instance: 1
    ID: -

    Ich habe es mit folgenen Befehl versucht:
    $i = ControlTreeView ("Service","","[CLASS:TreeViewWndClass; INSTANCE:1]","GetText", "item1")

    Vielen Dank für eure Hilfe.

    • Offizieller Beitrag

    Versuch mal mit ControlGetText und den Funktionen ob du generell an Infos kommst.
    Vom Einfachen zum Schwierigen - sprich erstmal manuell Fokus setzen und dann einfach nur per z.B. Hotkey Autoit-Funktionen durchlaufen lassen.
    Ergebnis alle in die Console schreiben und sehen ob es irgendwo geklappt hat.

    Ggf. auch bei AutoItSetOption mal die wichtigen Optionen durchtesten.
    Am einfachsten ginge es, wenn man es nachstellen könnte, dass Programm hätte.

  • Super vielen Dank für den Tipp.

    Mit ControlHide() konnte ich jetzt herausfinden, dass ich das TreeView ansprechen kann, also es in dem Fall mit:

    [autoit]

    Controlhide("Service","","[CLASS:TreeViewWndClass; INSTANCE:1]")

    [/autoit]

    das TreeView verstecken kann.

    nun ist die Herausforderung die einzelnen TreeViews Labels auszulesen.... und da scheitere ich aktuell.

    Zitat

    Am einfachsten ginge es, wenn man es nachstellen könnte, dass Programm hätte.

    Das Geht leider nicht, da es eine eigene Anwendung für unser Unternehmen ist. Mit einigen Millionen Kundendatensätzen....

  • Mein Problem ist es, dass ich die class, id oder Instanz von den einzelnen tree Labels nicht weis und somit diese nicht ansteuern kann. Das einzige was ich bis jetzt rausgefunden habe ist die class und die Instanz des gesamten TreeViews:

    Class: TreeViewWndClass
    Instanz: 1

    Zudem konnte ich die über die Messages die gesendet werden die wParam & iParam herausfinden. Nur ich weis nicht ob ich damit nun was anfangen kann.... Bzw. Stehe total auf dem Schlauch.

  • Das sind keine Messages sondern Notifications. Und iParam gibts nicht, wenn dann lParam.

    Aber was bekommt du, wenn du das ausführst? Natürlich in ControlGetHandle mit deinen Daten.

    Spoiler anzeigen
    [autoit]

    #include <GuiTreeView.au3>

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

    Global $hTreeview = ControlGetHandle("CLIP PROJECT", "", "[CLASS:SysTreeView32; INSTANCE:1]")
    Global $hItem = _GUICtrlTreeView_GetFirstItem($hTreeview)

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

    While 1
    $hItem = _GUICtrlTreeView_GetNext($hTreeview, $hItem)
    If $hItem = 0 Then ExitLoop
    ConsoleWrite(_GUICtrlTreeView_GetText($hTreeview, $hItem) & @CRLF)
    WEnd

    [/autoit]

    Edit: Hab nochwas gebastelt ;)

    Spoiler anzeigen
    [autoit]

    #include <GuiTreeView.au3>
    #include <Array.au3>

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

    Global $iCountY, $iCountX, $iCol = 0, $iRow = 0
    Global $hTreeview = ControlGetHandle("CLIP PROJECT", "", "[CLASS:SysTreeView32; INSTANCE:1]")
    Global $hItem = _GUICtrlTreeView_GetFirstItem($hTreeview)

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

    While 1
    $hItem = _GUICtrlTreeView_GetNext($hTreeview, $hItem)
    If $hItem = 0 Then ExitLoop
    If Not _GUICtrlTreeView_GetChildren($hTreeview, $hItem) Then $iCountY += 1
    If _GUICtrlTreeView_Level($hTreeview, $hItem) > $iCountX Then $iCountX = _GUICtrlTreeView_Level($hTreeview, $hItem)
    WEnd
    $iCountX += 1

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

    Global $aTreeview[$iCountY][$iCountX]

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

    $hItem = _GUICtrlTreeView_GetFirstItem($hTreeview)
    $aTreeview[0][0] = _GUICtrlTreeView_GetText($hTreeview, $hItem)

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

    While 1
    $hItem = _GUICtrlTreeView_GetNext($hTreeview, $hItem)
    If $hItem = 0 Then ExitLoop
    While 1
    $iCol += 1
    If $iCol = (UBound($aTreeview, 2) + 1) Then
    $iCol = 0
    $iRow += 1
    EndIf
    If _GUICtrlTreeView_Level($hTreeview, $hItem) = $iCol Then
    $aTreeview[$iRow][$iCol] = _GUICtrlTreeView_GetText($hTreeview, $hItem)
    ExitLoop
    EndIf
    WEnd
    WEnd

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

    _ArrayDisplay($aTreeview)

    [/autoit]

    2 Mal editiert, zuletzt von m-obi (14. Juli 2013 um 19:18)

  • Ok

    - TreeView erledigt
    - ListBox erledigt
    - ListView nach 5 Stunden kampf krieg es wieder nicht hin. Leider auch nicht mit der super Hilfe von m-obi.

    Ich krieg zwar die ControlHandle raus, aber die Werte aus der Liste bleiben wieder in verborgnen....

    Mit "_GUICtrlListView_GetItem" krieg ich leider ein Leeres Feld.

    Vielen Dank für eure Hilfe.

  • [autoit]

    _GUICtrlListView_GetItem(ControlGetHandle("Dein Fenster", "", "[CLASS:DeinLisview; INSTANCE:1]"), 0)

    [/autoit]


    klappt nicht?

  • Nene, da funktioniert ja auch bei anderen Listviews. Wie heißt denn die Class von deinem Listview?

  • Bekomme folgende Class von Window Info Tool:

    [CLASS:wVantive; INSTANCE:7]

    evtl. ist das garkeine Listview... Aber Listbox kann ich auf jedenfall ausschließen.

    Siehe Screenshot der Listview (sorry muss wg. Datenschutzrechtlichen Gründen unerkentlich gestalten)

    Evlt. ist die Listview in einem Tab und ich bekomme von diesem das Handle....
    Gibt es noch eine Möglichkeit in einem Tab an das Handle der Listview ran zukommen?

    Vielen Dank für die Hilfe.

    • Offizieller Beitrag

    Das ist ein individuelles Control der Firma Vantive Corporation (jetzt Oracle). Also hast du da irgendeine Software für Kundendienst/Qualitätssicherung.
    Individuelle Klassen verhalten sich leider nicht immer, wie M$-Klassen und somit geht es dann mit den Control-Funktionen in die Hose.

  • Ja hier hilft wohl nur noch der direkte Zugriff auf die SQL Datenbank. Da aber aus diesen Erkenntnissen Hilfs Tools für Agents erstellt werden sollen ist das mir ein zu großes Risiko, dass die Datenbank durch irgendein Fehler flachgelegt wird.

    Sollte ich dennoch irgendwie herausfinden wie ich die ListView ansteuern kann, werde ich das sofort mitteilen.

  • Na super, auch noch eine SQL Datenbank. Dann ist es ja noch einfacher.
    Das zeichnet einen guten Programmier aus, Programm so zu schreiben, das der User keine Fehler machen kann.