Получать уведомления при изменении значения RegistryKey - PullRequest
7 голосов
/ 20 ноября 2010

Я хочу получать уведомление, когда конкретный ключ реестра в 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 до c #, но я не нашел примеров использования для WBEM COM в c #

Я нашел этот класс 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 )

Ответы [ 2 ]

14 голосов
/ 20 ноября 2010

Я наконец решил проблему и получил версию запроса WMI:

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();

Я нашел этот "хак" в http://www.codeproject.com/Messages/2844468/Monitoring-HKEY_CURRENT_USER.aspx

0 голосов
/ 20 ноября 2010

Загружен в pastbin хороший класс, который делает это. Надеюсь, что это соответствует вашим потребностям.

http://www.csharp.pastebin.com/0reFh6v2

...