Registry aus Textdatei im Treeview anzeigen.

  • .. schubs :)

    Hallo zusammen,

    ich habe hier eine Textdatei (Auschnitt) die als Baumstruktur in einer Treeview angezeigt werden soll wie bsp. in Regedit.

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Res_Language=1031
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

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

    #include <Array.au3>
    #include <file.au3>
    #include <WindowsConstants.au3>
    #include <GuiConstantsEx.au3>
    #include <Constants.au3>
    #include <TabConstants.au3>
    #include <String.au3>
    #include <GuiTreeView.au3>
    #include <TreeViewConstants.au3>
    #include <GuiButton.au3>

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

    Opt("GUIOnEventMode", 1)
    #Region ### START Koda GUI section ###
    $Editor = GUICreate("", 1005, 711, -1, -1, BitOR($WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_SYSMENU, $WS_CAPTION, $WS_TABSTOP, $WS_BORDER, $WS_CLIPSIBLINGS))
    GUISetOnEvent($GUI_EVENT_CLOSE, "EditorClose")
    $BuildOptions = GUICtrlCreateTab(11, 32, 985, 650)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKBOTTOM)

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

    ;##### TAB 6 ##############################################################################################################
    $TabSheet6 = GUICtrlCreateTabItem("Registry")
    $Parameter_Group = GUICtrlCreateGroup("", 24, 75, 955, 450)
    $regTreeview = GUICtrlCreateTreeView(34, 92, 845, 420)
    $regWndTreeview = GUICtrlGetHandle($regTreeview)
    GUICtrlSetStyle($regTreeview, Default, $WS_EX_COMPOSITED + $WS_EX_CLIENTEDGE)
    $DirectoryIsolationMode_Group = GUICtrlCreateGroup("", 24, 532, 955, 135)

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

    $Button_TestRegistry = GUICtrlCreateButton("Test", 888, 92, 80, 28)
    GUICtrlSetOnEvent($Button_TestRegistry, "TestRegistry")

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

    ;##### END TAB 6 ##########################################################################################################

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

    GUISetState()
    #EndRegion ### END Koda GUI section ###

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

    While 1
    Sleep(100)
    WEnd

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

    Func TestRegistry()

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

    Dim $aRegistry[13]
    $file = FileOpen(@ScriptDir & "\HKEY_CURRENT_USER.txt", 0)
    $i = 0
    While 1
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop

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

    If StringLeft($line, 9) = "isolation" Then
    $aRegistry[$i] = $line
    $i = $i + 1
    EndIf
    WEnd
    FileClose($file)

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

    Local $CurRegKeyArray, $PrevRegKeyArray, $regKey
    $regRoot = _GUICtrlTreeView_Add($regTreeview, $regTreeview, "HKEY_CURRENT_USER")
    _GUICtrlTreeView_BeginUpdate($regTreeview)
    For $i = 0 To UBound($aRegistry) - 1
    If $i = 0 Then ;erster Zweig der Registry wird angelegt.
    $CurRegKeyArray = StringSplit($aRegistry[$i], "\", 2)
    For $x = 1 To UBound($CurRegKeyArray) - 1
    $regRoot = _GUICtrlTreeView_AddChild($regTreeview, $regRoot, $CurRegKeyArray[$x])
    Next
    Else
    $PrevRegKeyArray = StringSplit($aRegistry[$i - 1], "\", 2) ;vorherige Zeile
    $CurRegKeyArray = StringSplit($aRegistry[$i], "\", 2) ;aktuelle Zeile
    _ArrayReverse($CurRegKeyArray) ;Da vom letzten Element zum ersten gesucht wird, wird das Array gedreht
    For $x = 0 To UBound($CurRegKeyArray) - 1 ;Alle Werte der Zeile werden von hinten nach vorne abgearbeitet
    $SearchParent = _ArraySearch($PrevRegKeyArray, $CurRegKeyArray[$x], 1, 0, 0, 0) ;Mit dem aktuellen Wert wird in der vorherigen Zeile (Array)
    ;gesucht ob dort der Wert (Parent) gefunden wird.
    If $SearchParent = -1 Then ;Wenn nicht gefunden weiter
    Else
    $regKey = _GUICtrlTreeView_GetItemHandle($regTreeview, $PrevRegKeyArray[$SearchParent]) ;Wenn gefunden Parent ermittelt
    ExitLoop ;Schleife abbrechen
    EndIf
    Next
    _ArrayReverse($CurRegKeyArray) ;Array wieder in richtige Reihenfolge drehen
    $CurRegKeyArrayIndex = _ArraySearch($CurRegKeyArray, $PrevRegKeyArray[$SearchParent]) ;Startindex für die Abarbeitung ermitteln
    For $y = $CurRegKeyArrayIndex +1 To UBound($CurRegKeyArray) - 1
    MsgBox(0,"Startindex:" & $CurRegKeyArrayIndex, "Parent: " & $regKey & " (" & $PrevRegKeyArray[$SearchParent] & ")- " & "AddChild: " &$CurRegKeyArray[$y])
    $regKey = _GUICtrlTreeView_AddChild($regTreeview, $regKey, $CurRegKeyArray[$y])
    Next
    EndIf
    Next
    _GUICtrlTreeView_EndUpdate($regTreeview)
    EndFunc ;==>TestRegistry

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

    Func EditorClose()
    Exit
    EndFunc ;==>EditorClose

    [/autoit]

    Ich hab da jetzt noch ein bischen dran rumgewerkelt. Was ich vor allem nicht verstehe ist, das das was in der Msgbox ausgegeben und dann letztendlich im TreeView angezeigt wird überhaupt nichts miteinander zu tun hat? Vielleicht ist jemand so nett und schaut sich das mal an.

    Danke und gruß
    nasowas

    • Offizieller Beitrag

    Deine Textdatei heißt bei mir "treeview-baum.txt" und liegt im Scriptverzeichnis.
    Und hier ist dann das Script zum darstellen als Treeview:

    Spoiler anzeigen
    [autoit]


    #include <GuiTreeView.au3>
    Global $sFile, $aItems, $aSubItems, $oDictionary, $hGui, $hTreeView, $hParent
    Opt('GUIDataSeparatorChar', '\')

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

    $sFile = FileRead(@ScriptDir & '\treeview-baum.txt') ; <- Dateiname/-Pfad evtl. anpassen!
    $aItems = StringSplit($sFile, @CRLF, 1)
    If Not IsArray($aItems) Then Exit

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

    $hGui = GUICreate('test', 300, 400)
    $hTreeView = GUICtrlCreateTreeView(10, 10, 280, 380)
    $hWndTreeView = GUICtrlGetHandle($hTreeView)
    For $i = 1 To $aItems[0]
    $hParent = $hWndTreeView
    $sSearch = $aItems[$i]
    Do
    $hParent = _GUICtrlTreeView_FindItemEx($hWndTreeView, $sSearch)
    If Not $hParent Then $sSearch = StringRegExpReplace($sSearch, '(.+)\\.+', '$1')
    Until $hParent Or $sSearch = StringRegExpReplace($aItems[$i], '(.+?)\\.+', '$1')
    If $hParent Then
    _GUICtrlTreeView_CreatePath($hWndTreeView, $hParent, StringTrimLeft($aItems[$i], StringLen($sSearch) + 1))
    Else
    _GUICtrlTreeView_CreatePath($hWndTreeView, $hParent, $aItems[$i])
    EndIf
    Next
    GUISetState()
    Do
    Until GUIGetMsg() = -3

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

    Func _GUICtrlTreeView_CreatePath($hTreeView, $hParent, $sPath)
    Local $sItem
    If $sPath = '' Then Return
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $sItem = StringRegExpReplace($sPath, '(.+?)\\.*', '$1')
    $hParent = _GUICtrlTreeView_AddChild($hTreeView, $hParent, $sItem)
    _GUICtrlTreeView_CreatePath($hTreeView, $hParent, StringRegExpReplace($sPath, '.+?\\(.*)', '$1'))
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Ehrlich gesagt, habe ich mir Dein Skript gar nicht so genau angesehen. Ich habe das einfach nur so geschrieben, wie ich das machen würde.
    Und mit der rekursiven Funktion spart man einiges an Codezeilen bzw. ich wüsste jetzt gar nicht, wie man das anders machen sollte. Man muss halt bloss das entsprechende Parent-Item finden (Do...Until-Schleife). :)

  • Die Idee war, das Parent-Item nicht direkt im TreeView zu suchen sondern das (aus Performancegründen so die Theorie) in einem Array zu machen.

    Ich hab jetzt mal eine größere Datei benutzt und so ab Zeile 300-400 wird es zäh und irgendwann stürzt dann das Programm leider ab. Ich werde mal versuchen ob es möglich ist immer nur denn Teil des Baumes einzulesen der erweitert wird.

    gruß
    nasowas