VB.NET Как реализовать мониторинг реестра?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by z0mbyak, 21 May 2011.

  1. z0mbyak

    z0mbyak Active Member

    Joined:
    10 Apr 2010
    Messages:
    536
    Likes Received:
    200
    Reputations:
    293
    Доброго времени суток, уважаемые форумчане.

    Хочу написать маленькую программу, которая будет проверять изменения одной папки реестра, если есть изменения, сразу их удалять.

    Вы не могли бы подсказать как мониторить не конкретный ключ, а папку реестра?

    Заранее благодарю.

    P.S С реестром еще не сталкивался...
     
  2. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    папка реестра и есть ключ. то что ты подразумеваешь под ключём, является значением.

    для мониторинга ключа юзай что-то типа этого:
    Code:
    Public Class RegistryWatcher
        Public MonitorCollection As New Collections.Generic.Dictionary(Of String, Monitor)
    
        Public Event RegistryChanged(ByVal M As Monitor)
    
        Public Enum HKEY_ROOTS As Integer
            HKEY_CLASSES_ROOT = 0
            HKEY_CURRENT_USER = 1
            HKEY_LOCAL_MACHINE = 2
            HKEY_USERS = 3
            HKEY_CURRENT_CONFIG = 4
        End Enum
    
        Public Sub AddWatcher(ByVal Root As HKEY_ROOTS, ByVal Path As String, ByVal ID As String)
            If MonitorCollection.ContainsKey(ID) = False Then
                Dim RegMon As New Monitor(Root, Path, ID)
                AddHandler RegMon.Changed, AddressOf OnRegistryChanged
                MonitorCollection.Add(ID, RegMon)
            End If
        End Sub
    
        Public Sub RemoveWatcher(ByVal ID As String)
            If MonitorCollection.ContainsKey(ID) = True Then
                MonitorCollection(ID).StopWatch()
                MonitorCollection.Remove(ID)
            End If
        End Sub
    
        Private Sub OnRegistryChanged(ByVal M As Monitor)
            RaiseEvent RegistryChanged(M)
        End Sub
    
    
        Public Class Monitor
            Private mRoot As HKEY_ROOTS
            Private mPath As String
            Private mID As String
            Private mStop As Boolean
    
            Public ReadOnly Property Root() As HKEY_ROOTS
                Get
                    Return mRoot
                End Get
            End Property
    
            Public ReadOnly Property Path() As String
                Get
                    Return mPath
                End Get
            End Property
    
            Public ReadOnly Property ID() As String
                Get
                    Return mID
                End Get
            End Property
    
            Public Event Changed(ByVal M As Monitor)
    
            Sub New(ByVal NewRoot As HKEY_ROOTS, ByVal NewPath As String, ByVal NewID As String)
                mRoot = NewRoot
                mPath = NewPath
                mID = NewID
    
                Dim T As New Threading.Thread(AddressOf Watcher)
                T.Start()
            End Sub
    
            Public Sub StopWatch()
                mStop = True
            End Sub
    
            Private Sub Watcher()
                Dim WMIObject As Object
                Dim WMIEvent As Object
                Dim WMICurrEvent As Object
    
                mPath = Replace(mPath, "\", "\\")
    
                WMIObject = GetObject("winmgmts:\\.\root\default")
    
                    WMIEvent = WMIObject.ExecNotificationQuery( _
                        "SELECT * FROM RegistryKeyChangeEvent WHERE Hive='" & _
                        mRoot.ToString & "' AND " & "KeyPath='" & mPath & "'")
    
                Do
                    Try
                        If mStop = True Then
                            mStop = False
                            Exit Sub
                        End If
                        WMICurrEvent = WMIEvent.NextEvent(500)
                        RaiseEvent Changed(Me)
                    Catch ex As Exception
                    End Try
                Loop
            End Sub
        End Class
    End Class
    
     
    1 person likes this.