Daten aus DataGrid auslesen

  • Hallo Gemeinde,

    ich suche schon eine ganze Weile (ja - auch per Google, ja - auch in englisch) nach einem lesenden Zugriff auf Daten in einem Dialog:
    http://i.imgur.com/WGFHH.jpg und http://i.imgur.com/vXwQx.jpg


    Ich benutze die aktuelle AutoIT Beta Version 3.3.7.14 ( parallel zum Release 3.3.6.1). Vorab noch: der alternative Weg 'hintenrum' über Strg+c und Strg+v in ein anderes Programm funktioniert nicht :(

    In dem fernzusteuernden Programm ist das der einzige Dialog dieser Bauart, vmtl. ein NET Control. Mit dem AutoIt Info Tool bekomme ich nur das übergeordnete Fenster, nicht die einzelnen Elemente. Mit dem RanorexSpy bekomme ich immerhin auch die einzelnen Elemente wie Überschrift, Zeile und Einzelelement - habe aber bisher noch keine Funktion gefunden um darauf zuzugreifen. Das Inspect aus dem Windows SDK zeigt zwar faktisch diese Elemente auch an, aber nur im rechten Fenster in der Datenansicht - nicht im linken Fenster mit der Baumansicht, an der man sich durchhangeln könnte.

    Der Plan geht dahin, das übergeordnete Handle zu finden und sich dann irgendwie durch den Baum drunter zu den einzelnen Elementen mit den Daten zu hangeln. Hat dafür jemand weitere Tools und einen Ansatzpunkt zur Lösung, wie so etwas zu bewerkstelligen ist?


    Danke im Voraus

    Bon


    Nachtrag:
    Wenn im Programm Inspect (das vom Windows SDK) MSAA Mode an Stelle von UI Automation Mode gewählt wird, dann tauchen die Elemente des Hauptfensters und deren Handles dort auch auf - siehe http://i.imgur.com/7iAWM.jpg . Da sieht man auch wunderschön den Baum mit dem obersten Element und dessen ganzen Children. Ich suche aber immer noch eine Möglichkeit, vom Top Element - notfalls das Handle des ganzen Dialogs - zu den Children nach unten zu navigieren und die Daten selber sind immer noch nicht abrufbar ...

    4 Mal editiert, zuletzt von bongo (12. Juli 2011 um 00:58) aus folgendem Grund: falscher zweiter Link :(

  • Ich habe inzwischen etwas weiter gebastelt und mir überallher etwas angelesen und damit rumgespielt. Derzeit habe mit mit der IAccessible GUID über die DLL oleacc.dll und deren Aufruf mit AccessibleObjectFromWindow das Fenster geholt, die Anzahl deren Children und Pointer auf diese - aber wie weiter?

    Hier der Stand:

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

    #include <WinAPI.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Opt("WinWaitDelay", 0)
    Opt("GUIOnEventMode", 1)
    Opt("MustDeclareVars", 1)
    Global $oMyError = ObjEvent("AutoIt.Error", "_ErrFunc")
    Global $hOLEACC = DllOpen("oleacc.dll")

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

    ; Initalize COM
    ; DIM $hOle32=DllOpen("Ole32.dll")
    ; DllCall($hOle32,"ulong","CoInitialize","ptr",0)

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

    Dim $hWnd = WinGetHandle("Adresssuche")
    dim $pAccObj = _AccessibleObjectFromWindow( $hwnd )
    If IsObj($pAccObj) Then
    ConsoleWrite("accChildCount: " & $pAccObj.accChildCount & @CRLF)
    ConsoleWrite("accDefaultAction: " & $pAccObj.accDefaultAction & @CRLF)
    ConsoleWrite("accDescription: " & $pAccObj.accDescription & @CRLF)
    ConsoleWrite("accFocus: " & $pAccObj.accFocus & @CRLF)
    ConsoleWrite("accKeyboardShortcut: " & $pAccObj.accKeyboardShortcut & @CRLF)
    ConsoleWrite("accName: " & $pAccObj.accName & @CRLF)
    ConsoleWrite("accParent: " & $pAccObj.accParent & @CRLF)
    ConsoleWrite("accRole: " & $pAccObj.accRole & @CRLF)
    ConsoleWrite("accSelection: " & $pAccObj.accSelection & @CRLF)
    ConsoleWrite("accState: " & $pAccObj.accState & @CRLF)
    ConsoleWrite("accValue: " & $pAccObj.accValue & @CRLF)
    DIM $pAccChildren = _AccessibleChildren( $pAccObj, 0, $pAccObj.accChildCount )
    For $i = 1 to $pAccObj.accChildCount
    ; hier geht's ertstmal nicht weiter :\
    ConsoleWrite( "Children1 " & $i & DllStructGetData( $pAccChildren, $i, 1 ) & @CRLF )
    Next
    EndIf

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

    Func _AccessibleObjectFromWindow( $hwnd )
    Local Const $OBJID_WINDOW = 0x00000000
    Local $sIID_IAccessible_GUID = "{618736E0-3C3D-11CF-810C-00AA00389B71}" ; Define the IAccessible GUID
    Local $tGUID = _WinAPI_GUIDFromString( $sIID_IAccessible_GUID )
    Local $pGUID = DllStructGetPtr( $tGUID )
    Dim $result = DllCall("oleacc.dll", "long", "AccessibleObjectFromWindow", _
    "hwnd", $hWnd, _
    "dword", $OBJID_WINDOW, _
    "ptr", $pGUID, _
    "idispatch*", 0)
    Return( $result[4] )
    EndFunc

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

    Func _AccessibleChildren( $pAccObj, $iChildrenStart, $iNumChildren )
    Local $tVARIANT, $pVARIANT
    Local $sStruct = ""
    Local $aResult
    For $i = 1 To $iNumChildren
    $sStruct &= "int[4];"
    Next
    $tVARIANT = DllStructCreate( $sStruct )
    $pVARIANT = DllStructGetPtr( $tVARIANT )
    $aResult = DllCall("oleacc.dll", "int", "AccessibleChildren", _
    "ptr", $paccObj, _
    "int", $iChildrenStart, _
    "int", $iNumChildren, _
    "ptr", $pVARIANT, _
    "int*", 0)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError(0, $aResult[5], $tVARIANT)
    EndFunc

    Func _ErrFunc()
    ConsoleWrite("--- COM Error, number = " & Ptr($oMyError.number) & ", description: " & $oMyError.windescription)
    EndFunc ;==>_ErrFunc

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

    Func _Quit()
    Exit
    EndFunc ;==>_Quit
    ;
    exit

    [/autoit]

    3 Mal editiert, zuletzt von bongo (12. Juli 2011 um 19:19)

  • Also ich bin mir nicht sicher was du nun eigentlich erreichen willst. Sollen die Daten in der Tabelle rechts ausgelesen werden? Wenn ja dann würde ich mal an deiner Stelle diese Funktion testen:

    [autoit]

    ControlListView()

    [/autoit]

    Das ganze schaut jedenfalls nach einen Listview Control aus und somit solltest du mit der genannten Funktion auch an alle Daten der Tabelle kommen.

  • Ja, ich möchte u.a. die Daten in der Tabelle rechts auslesen.

    Nein, das ist kein Listview Control. Das ist was selbstgebautes. Wie schon geschrieben kommt man da nicht einfach so ran. Das ist ein Control Namens ultraGrid, erzeugt mit einer Library von Infragistics - vmtl. deren .Net Controls.

    Ich hangle mich schon seit geraumer Zeit durch div. Möglichkeiten und das bisher interessanteste dabei ist der Beitrag mit Code von Authenticity hier: http://www.autoitscript.com/forum/topic/98…cessibleobject/