usar sistema notificaciones como c# registry wmi notifications wbem

sistema - como usar notifyicon c#



Recibir notificación cuando se cambió el valor de RegistryKey (2)

Quiero una notificación cuando se cambia un RegistryKey específico en HKEY_CURRENT_USER . Hasta ahora probé esto a través de WMI sin éxito:

var query = new WqlEventQuery(string.Format( "SELECT * FROM RegistryKeyChangeEvent WHERE Hive=''{0}'' AND KeyPath=''{1}'' AND ValueName=''{2}''", hive, keyPath.Replace("//","////"), valueName)); _watcher = new ManagementEventWatcher(query); _watcher.Scope.Path.NamespacePath = @"root/default"; _watcher.EventArrived += (sender, args) => KeyValueChanged(); _watcher.Start();

(El error fue "No encontrado")

Mi segundo enfoque fue utilizar el WBEM Scripting COM component con la intención de convertir el ejemplo de http://msdn.microsoft.com/en-us/library/aa393042(VS.85).aspx a c # pero no encontré cualquier muestra de uso para WBEM COM en c #

Encontré esta clase de http://www.codeproject.com/KB/system/registrymonitor.aspx , pero no se ajustaba a mis necesidades ya que esta clase solo monitorea la clave completa y solo quiero una notificación cuando un valor específico (especificado a través de ValueName en los ejemplos anteriores) se cambia.

EDITAR: Si cambia el Hive a HKEY_CURRENT_USER en el ejemplo msdn vbscript, deja de funcionar. No pude encontrar nada sobre este comportamiento, pero un enlace desde 2003

EDIT2: Los cambios en las secciones HKEY_CLASSES_ROOT y HKEY_CURRENT_USER no son compatibles con RegistryEvent o las clases derivadas de él, como RegistryValueChangeEvent . ( MSDN )



Finalmente resolví el problema y conseguí que la versión de consulta WMI funcionara:

var currentUser = WindowsIdentity.GetCurrent(); var query = new WqlEventQuery(string.Format( "SELECT * FROM RegistryValueChangeEvent WHERE Hive=''HKEY_USERS'' AND KeyPath=''{0}////{1}'' AND ValueName=''{2}''", currentUser.User.Value, keyPath.Replace("//","////"), valueName)); _watcher = new ManagementEventWatcher(query); _watcher.EventArrived += (sender, args) => KeyValueChanged(); _watcher.Start();

Encontré este "truco" en http://www.codeproject.com/Messages/2844468/Monitoring-HKEY_CURRENT_USER.aspx