当HKEY_CURRENT_USER中的特定RegistryKey发生更改时,我希望收到通知。到目前为止,我通过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#,但是我没有在c#中找到任何WBEM COM的用法示例
我找到了这个http://www.codeproject.com/KB/system/registrymonitor.aspx类,但它不符合我的需要,因为这个类只监视整个键,并且我只想在特定值(通过上面示例中的ValueName指定)发生更改时得到通知。
编辑:如果在msdn vbscript示例中将配置单元更改为HKEY_CURRENT_USER,它将停止工作。我找不到任何关于这种行为的东西除了a link from 2003
EDIT2:RegistryEvent或从其派生的类(如RegistryValueChangeEvent )不支持对HKEY_CLASSES_ROOT和HKEY_CURRENT_USER配置单元的更改。(MSDN)
发布于 2010-11-21 04:01:32
我最终解决了这个问题,并使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上发现了这个“黑客”
发布于 2010-11-21 00:43:40
上传到pastbin一个很好的类可以做到这一点。希望它能满足你的需求。
http://www.csharp.pastebin.com/0reFh6v2
https://stackoverflow.com/questions/4233746
复制相似问题