Populate treeview with registry

grmbl

Active member
Joined
Jun 4, 2009
Messages
32
Location
Belgium
Programming Experience
1-3
Hey,

Is there anyone here who could help me on my way to
create my own custom "regedit"?

First and probably only problem is iterating through the registry
starting from the root....

Anyone has experience with this topic?

Any help greatly appreciated!

grtz

KabgfAACO
 
I allready found a solution and thought it would be a good idea to post it
here:

VB.NET:
Dim root As TreeNode
        root = New TreeNode("This computer")
        root.ImageIndex = 5
        root.SelectedImageIndex = 5

        'HKEY_CLASSES_ROOT
        Dim rootnode As TreeNode
        rootnode = New TreeNode(Microsoft.Win32.Registry.ClassesRoot.Name.ToString)
        rootnode.ImageIndex = 4
        rootnode.SelectedImageIndex = 4
        Dim rootsubkeys() As String = Microsoft.Win32.Registry.ClassesRoot.GetSubKeyNames()
        For Each k As String In rootsubkeys
            Dim node As TreeNode
            node = New TreeNode(k)
            node.ImageIndex = 3
            node.SelectedImageIndex = 3
            Dim subkeys() As String = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(k).GetSubKeyNames()
            For Each subkeyskey As String In subkeys
                node.Nodes.Add(subkeyskey, subkeyskey, 0, 3)
            Next
            rootnode.Nodes.Add(node)
        Next
        root.Nodes.Add(rootnode)

tReg.Nodes.Add(root)

        tReg.Nodes(0).ExpandAll()

This can be used to list the whole registry.
The variables are "Microsoft.Win32.Registry.ClassesRoot" and the imageindices...

Hope this helps someone in the future!
 
This is the more flexible code:

NOTE: this is not recursive!!! Not everything is shown!!!

(Uncomment imageindex/selectedimageindex if you have an imagelist set with
appropriate images and have a treeview with that imagelist set.)

VB.NET:
Public Sub RegNode(ByVal tree As TreeView, ByVal reg As Microsoft.Win32.RegistryKey)

        Dim tn As TreeNode
        ' Add node with name of registrykey
        tn = New TreeNode(reg.Name.ToString)
        'tn.ImageIndex = 4
        'tn.SelectedImageIndex = 4

        'Get all the subkeynames and put them in an array
        Dim tns() As String = reg.GetSubKeyNames()

        'Loop through all subkeynames and their subkeys
        For Each k As String In tns
            Dim n As TreeNode
            n = New TreeNode(k)
            'n.ImageIndex = 3
            'n.SelectedImageIndex = 3
            Try
                Dim sk() As String = reg.OpenSubKey(k).GetSubKeyNames
                For Each sksk As String In sk
                    'n.Nodes.Add(sksk, sksk, 3, 3)
                    n.Nodes.Add(sksk, sksk)
                Next
            Catch ex As Exception
                'Failsafe for subkeys that are inaccessible
                'n.ImageIndex = 6
                'n.SelectedImageIndex = 6
            End Try
            tn.Nodes.Add(n)
        Next

        tree.Nodes.Add(tn)

End Sub
Usage:
VB.NET:
RegNode(tReg, Microsoft.Win32.Registry.ClassesRoot)
Example:
VB.NET:
Private Sub fRegistry_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ' Add node with computername
        Dim root As TreeNode
        root = New TreeNode(My.Computer.Name)
        'root.ImageIndex = 5
        'root.SelectedImageIndex = 5

        tReg.Nodes.Add(root)

        RegNode(tReg, Microsoft.Win32.Registry.ClassesRoot)
        RegNode(tReg, Microsoft.Win32.Registry.CurrentConfig)
        RegNode(tReg, Microsoft.Win32.Registry.CurrentUser)
        RegNode(tReg, Microsoft.Win32.Registry.LocalMachine)

        ' Expand computername node
        tReg.Nodes(0).Expand()

End Sub
 
Last edited:
People, I need some help with this!!!
I tried recursively populating my treeview with the registry structure
but I'm stuck.... :(

This is what I have so far:
VB.NET:
Private Sub fRegistry_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ' Add node with computername
        'Dim root As TreeNode
        'root = New TreeNode(My.Computer.Name)
        'root.ImageIndex = 5
        'root.SelectedImageIndex = 5

        'tReg.Nodes.Add(root)

        'RegNode(Microsoft.Win32.Registry.ClassesRoot, tReg)
        'RegNode(Microsoft.Win32.Registry.CurrentConfig, tReg)
        'RegNode(Microsoft.Win32.Registry.CurrentUser, tReg)
        'RegNode(Microsoft.Win32.Registry.LocalMachine, tReg)
        'RegNode(Microsoft.Win32.Registry.Users, tReg)

        '' Expand computername node
        'tReg.Nodes(0).Expand()

        For Each key As Microsoft.Win32.RegistryKey In New Microsoft.Win32.RegistryKey() { _
                Microsoft.Win32.Registry.ClassesRoot, _
                Microsoft.Win32.Registry.CurrentConfig, _
                Microsoft.Win32.Registry.CurrentUser, _
                Microsoft.Win32.Registry.LocalMachine, _
                Microsoft.Win32.Registry.Users _
                }
            Dim rn As TreeNode
            rn = New TreeNode
            rn = TreeReg(key)
            rn.ImageIndex = 4
            rn.SelectedImageIndex = 4
            rn.Text = key.Name
            tReg.Nodes.Add(rn)
        Next

    End Sub

    Public Function TreeReg(ByVal key As Microsoft.Win32.RegistryKey) As TreeNode

        If key Is Nothing Then
            Return Nothing
        End If

        Dim tn As TreeNode
        tn = New TreeNode

        ' Valuenames under key
        For Each vn As String In key.GetValueNames()
            Dim valn As TreeNode
            valn = New TreeNode
            valn.Text = vn

            Dim value As Object = key.GetValue(vn)
            tn.Nodes.Add(valn)
        Next

        'Subkeynames under key/subkey
        For Each skn As String In key.GetSubKeyNames()
            Dim subn As TreeNode
            subn = New TreeNode
            subn.ImageIndex = 3
            subn.SelectedImageIndex = 3
            subn.Text = skn

            tn.Nodes.Add(subn)

            Try
                TreeReg(key.OpenSubKey(skn))
            Catch ex As Security.SecurityException
                ' can't search this one, just skip it
            End Try

        Next

        Return tn

    End Function

The problem lies with
VB.NET:
TreeReg(key.OpenSubKey(skn))

Can anybody help to finally create something working and so it can be
shared. (because I haven't found anything on the web like this...)

Cheers,

grmbl!
 
How about if the registry is user input?

This is the more flexible code:

NOTE: this is not recursive!!! Not everything is shown!!!

(Uncomment imageindex/selectedimageindex if you have an imagelist set with
appropriate images and have a treeview with that imagelist set.)

VB.NET:
Public Sub RegNode(ByVal tree As TreeView, ByVal reg As Microsoft.Win32.RegistryKey)

        Dim tn As TreeNode
        ' Add node with name of registrykey
        tn = New TreeNode(reg.Name.ToString)
        'tn.ImageIndex = 4
        'tn.SelectedImageIndex = 4

        'Get all the subkeynames and put them in an array
        Dim tns() As String = reg.GetSubKeyNames()

        'Loop through all subkeynames and their subkeys
        For Each k As String In tns
            Dim n As TreeNode
            n = New TreeNode(k)
            'n.ImageIndex = 3
            'n.SelectedImageIndex = 3
            Try
                Dim sk() As String = reg.OpenSubKey(k).GetSubKeyNames
                For Each sksk As String In sk
                    'n.Nodes.Add(sksk, sksk, 3, 3)
                    n.Nodes.Add(sksk, sksk)
                Next
            Catch ex As Exception
                'Failsafe for subkeys that are inaccessible
                'n.ImageIndex = 6
                'n.SelectedImageIndex = 6
            End Try
            tn.Nodes.Add(n)
        Next

        tree.Nodes.Add(tn)

End Sub
Usage:
VB.NET:
RegNode(tReg, Microsoft.Win32.Registry.ClassesRoot)
Example:
VB.NET:
Private Sub fRegistry_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ' Add node with computername
        Dim root As TreeNode
        root = New TreeNode(My.Computer.Name)
        'root.ImageIndex = 5
        'root.SelectedImageIndex = 5

        tReg.Nodes.Add(root)

        RegNode(tReg, Microsoft.Win32.Registry.ClassesRoot)
        RegNode(tReg, Microsoft.Win32.Registry.CurrentConfig)
        RegNode(tReg, Microsoft.Win32.Registry.CurrentUser)
        RegNode(tReg, Microsoft.Win32.Registry.LocalMachine)

        ' Expand computername node
        tReg.Nodes(0).Expand()

End Sub

Hello, All.

I find this very very useful.
But I'm doing modification of this codes but I can't get my wanted output.

What if there are user inputs of registries they wanted to show not all under HKLM/HKCU/HKCR/HKCC etc.

Example:

HKLM\Software\Adobe
HKCU\Software\Adobe
HKCR\.doc

Also if users put HKLM\SYSTEM\ControlSet001 it will combine the all same HKLM entries into one node.

HKLM
+Software
+Adobe​
+SYSTEM
+ControlSet001​
HKCU
+Software
+Adobe​
HKCR
+.doc

Hope to hear from you all.

Regards,
Jeff
 
Back
Top