Registry aus Textdatei im Treeview anzeigen.
-
- [ gelöst ]
-
nasowas -
24. Februar 2010 um 21:16 -
Geschlossen -
Erledigt
-
-
.. schubs
Hallo zusammen,
ich habe hier eine Textdatei (Auschnitt) die als Baumstruktur in einer Treeview angezeigt werden soll wie bsp. in Regedit.
Zitatisolation_full HKEY_CURRENT_USER\Software\Adobe
isolation_full HKEY_CURRENT_USER\Software\Adobe\Acrobat Reader
isolation_full HKEY_CURRENT_USER\Software\Adobe\Acrobat Reader\9.0
isolation_full HKEY_CURRENT_USER\Software\Adobe\Acrobat Reader\9.0\AdobeViewer
isolation_full HKEY_CURRENT_USER\Software\Adobe\Acrobat Reader\9.0\AVConversionFromPDF
isolation_full HKEY_CURRENT_USER\Software\Adobe\Acrobat Reader\9.0\AVConversionFromPDF\cSettings
isolation_full HKEY_CURRENT_USER\Software\Adobe\Acrobat Reader\9.0\AVConversionToPDF
isolation_full HKEY_CURRENT_USER\Software\Adobe\Acrobat Reader\9.0\AVConversionToPDF\cSettings
isolation_full HKEY_CURRENT_USER\Software\Adobe\Acrobat Reader\9.0\AVDisplay
isolation_full HKEY_CURRENT_USER\Software\Adobe\Acrobat Reader\9.0\AVConversionToPDF\cSettings\Test
isolation_full HKEY_CURRENT_USER\Software\Policies\Microsoft\SystemCertificates\TrustedPublisher
isolation_full HKEY_CURRENT_USER\Software\Policies\Microsoft\SystemCertificates\TrustedPublisher\Certificates
isolation_full HKEY_CURRENT_USER\Software\Policies\Microsoft\SystemCertificates\TrustedPublisher\CRLsSpoiler anzeigen
[autoit]#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
[/autoit] [autoit][/autoit] [autoit]
#AutoIt3Wrapper_Res_Language=1031
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]
#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>Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]
#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);##### TAB 6 ##############################################################################################################
[/autoit] [autoit][/autoit] [autoit]
$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)$Button_TestRegistry = GUICtrlCreateButton("Test", 888, 92, 80, 28)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetOnEvent($Button_TestRegistry, "TestRegistry");##### END TAB 6 ##########################################################################################################
[/autoit] [autoit][/autoit] [autoit]GUISetState()
[/autoit] [autoit][/autoit] [autoit]
#EndRegion ### END Koda GUI section ###While 1
[/autoit] [autoit][/autoit] [autoit]
Sleep(100)
WEndFunc TestRegistry()
[/autoit] [autoit][/autoit] [autoit]Dim $aRegistry[13]
[/autoit] [autoit][/autoit] [autoit]
$file = FileOpen(@ScriptDir & "\HKEY_CURRENT_USER.txt", 0)
$i = 0
While 1
$line = FileReadLine($file)
If @error = -1 Then ExitLoopIf StringLeft($line, 9) = "isolation" Then
[/autoit] [autoit][/autoit] [autoit]
$aRegistry[$i] = $line
$i = $i + 1
EndIf
WEnd
FileClose($file)Local $CurRegKeyArray, $PrevRegKeyArray, $regKey
[/autoit] [autoit][/autoit] [autoit]
$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 ;==>TestRegistryFunc EditorClose()
[/autoit]
Exit
EndFunc ;==>EditorCloseIch 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]
[/autoit] [autoit][/autoit] [autoit]
#include <GuiTreeView.au3>
Global $sFile, $aItems, $aSubItems, $oDictionary, $hGui, $hTreeView, $hParent
Opt('GUIDataSeparatorChar', '\')$sFile = FileRead(@ScriptDir & '\treeview-baum.txt') ; <- Dateiname/-Pfad evtl. anpassen!
[/autoit] [autoit][/autoit] [autoit]
$aItems = StringSplit($sFile, @CRLF, 1)
If Not IsArray($aItems) Then Exit$hGui = GUICreate('test', 300, 400)
[/autoit] [autoit][/autoit] [autoit]
$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() = -3Func _GUICtrlTreeView_CreatePath($hTreeView, $hParent, $sPath)
[/autoit]
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 -
Vielen Dank
Da lag ich ja mit meinem Ansatz völlig daneben...
-
- 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