Bestimmte Registry Keys oder Values überwachen Verfasst am: 29.06.2009, 13:22
Beschreibung: 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.
Funktion: Visual Basic: [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, 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
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
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[/code]