Diese Klasse überwacht veränderungen in der Registry entweder an einem Key oder an einem Wert.
Wenn man einen Key überwacht wird das Event immer dann ausgelöst wenn irgendetwas an diesem Key geändert wird wie z.B. es wird unter diesem Key ein neuer Key angelegt oder es wird ein Wert geändert.
Wenn man einen Wert überwacht wird das Event immer nur dann ausgelöst wenn auch genau dieser Wert verändert wird.
''' <summary>
''' Diese Klasse überwacht Veränderungen in der Registry entweder an einem Key oder an einem Wert.
''' Wenn man einen Key überwacht wird das Event immer dann ausgelöst wenn irgendetwas an diesem Key geändert wird wie z.B. es wird unter diesem Key ein neuer Key angelegt oder es wird ein Wert geändert.
''' Wenn man einen Wert überwacht wird das Event immer nur dann ausgelöst wenn auch genau dieser Wert verändert wird.
''' </summary>
''' <remarks>Copyright © 2006 Tim Hartwig</remarks>
Public Class RegistryWatcher
Public MonitorCollection As New Collections.Generic.Dictionary(Of String, Monitor)
''' <summary>
''' Diese Event wird ausgelöst wenn sich etwas bei einem überwachten Schlüssel oder Wert verändert
''' </summary>
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
''' <summary>
''' Fügt einen Watcher hinzu um einen bestimmten Key oder Wert zu überwachen.
''' Wenn man nur einen Key überwachen will dann muss man den Parameter Value leer lassen.
''' Wenn man jedoch einen Wert überwachen will muss man den zu überwachenden Wert beim Parameter Value eintragen.
''' </summary>
''' <param name="Root">Das ROOT Verzeichnis der Registry.</param>
''' <param name="Path">Der Pfad der überwacht werden soll.</param>
''' <param name="ID">Eine benutzerdefinierte ID um den Watcher zu identifizieren.</param>
''' <param name="Value">Optional: Wenn man einen Wert überwachen will muss man den Namen des Werts hier eintragen aber nicht den Wert selber.</param>
Public Sub AddWatcher(ByVal Root As HKEY_ROOTS, ByVal Path As String, ByVal ID As String, Optional ByVal Value As String = "")
If MonitorCollection.ContainsKey(ID) = False Then
Dim RegMon As New Monitor(Root, Path, ID, Value)
AddHandler RegMon.Changed, AddressOf OnRegistryChanged
MonitorCollection.Add(ID, RegMon)
End If
End Sub
''' <summary>
''' Deaktiviert und entfernt einen bestimmten Watcher.
''' </summary>
''' <param name="ID">Die ID des zu entfernenden Watchers</param>
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 mValue 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 ReadOnly Property Value() As String
Get
Return mValue
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, ByVal NewValue As String)
mRoot = NewRoot
mPath = NewPath
mID = NewID
mValue = NewValue
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, "\", "\\")
'Aktuellen Computer überwachen
WMIObject = GetObject("winmgmts:\\.\root\default")
If mValue = "" Then
'Kein Wert angegeben also nur den Key überwachen
WMIEvent = WMIObject.ExecNotificationQuery( _
"SELECT * FROM RegistryKeyChangeEvent WHERE Hive='" & _
mRoot.ToString & "' AND " & "KeyPath='" & mPath & "'")
Else
'Es wurde ein Wert angegeben also wird genau dieser Wert überwacht
WMIEvent = WMIObject.ExecNotificationQuery( _
"SELECT * FROM RegistryValueChangeEvent WHERE Hive='" & _
mRoot.ToString & "' AND " & "KeyPath='" & mPath & "' AND ValueName='" & mValue & "'")
End If
Do
Try
'Für 500ms auf eine änderung warten danach wirft das Event eine Exception und es wird erneut gewartet.
'Wenn innerhalb dieser 500ms alledings eine änderung auftretet dann wird das Event der Klasse ausgelöst
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 Kommentare zum Snippet