Я хочу получить уведомление, когда изменяется конкретный RegistryKey в HKEY_CURRENT_USER
. До сих пор я попытался это с помощью WMI
без успеха:Получить уведомление, когда RegistryKey Значение было изменено
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 на C#, но Я не нашел примеров использования для WBEM COM в C#
Я нашел этот класс http://www.codeproject.com/KB/system/registrymonitor.aspx, но это не соответствовало моим потребностям, так как этот класс контролирует весь ключ, и мне нужно только уведомление, когда определенное значение (определяется через ValueName
в sa сверху).
EDIT: Если вы изменили Улей на HKEY_CURRENT_USER
в примере msdn vbscript, он перестает работать. Я не мог найти ничего об этом поведении, но a link from 2003
EDIT2: Изменения в HKEY_CLASSES_ROOT
и HKEY_CURRENT_USER
ульев не поддерживаются RegistryEvent
или классов, производных от него, например, RegistryValueChangeEvent
. (MSDN)
Я считаю, что вы можете изменить код-проект код, чтобы использовать несколько дескрипторов/мониторов для всех, чтобы определить, какой ключ был изменен. Я не уверен, что последствия для n мониторов - это не так уж плохо: http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx :-) – 2010-11-20 19:11:00