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 )
Subido a pastbin una buena clase que lo hace. Espero que se ajuste a tus necesidades.
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