我希望在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示例中将Hive更改为HKEY_CURRENT_USER
,它将停止工作。我无法找到有关此行为的任何内容,但a link from 2003
EDIT2:
HKEY_CLASSES_ROOT
或从HKEY_CURRENT_USER
派生的类不支持对RegistryEvent
和RegistryValueChangeEvent
配置单元的更改,例如{{1}}。 (MSDN)
答案 0 :(得分:13)
我终于解决了问题并使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
发现了这个“黑客”答案 1 :(得分:0)
上传到pastbin这是一个很好的类。希望它符合您的需求。