Мне нужно уведомление, когда конкретный RegistryKey в HKEY_CURRENT_USER
изменяется. До сих пор я пробовал это через WMI
безуспешно:
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();
(Ошибка "Не найдено")
Мой второй подход заключался в использовании WBEM Scripting COM component
с намерением перенести пример из http://msdn.microsoft.com/en-us/library/aa393042(VS.85).aspx на С#, но я не нашел примеров использования для WBEM COM в С#
Я нашел это http://www.codeproject.com/KB/system/registrymonitor.aspx, но он не соответствовал моим потребностям, так как этот класс отслеживает только весь ключ, и мне нужно только уведомление, когда конкретное значение (указанное с помощью ValueName
в приведенных выше примерах) изменяется.
РЕДАКТИРОВАТЬ: Если вы измените Hive на HKEY_CURRENT_USER
в примере msdn vbscript, он перестанет работать. Мне ничего не удалось найти об этом поведении, но ссылка 2003 года
EDIT2: изменения в ульях HKEY_CLASSES_ROOT
и HKEY_CURRENT_USER
не поддерживаются RegistryEvent
или производными от него классами, такими как RegistryValueChangeEvent
. (MSDN )