首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在RegistryKey值更改时接收通知

在RegistryKey值更改时接收通知
EN

Stack Overflow用户
提问于 2010-11-21 00:36:12
回答 2查看 9.2K关注 0票数 7

HKEY_CURRENT_USER中的特定RegistryKey发生更改时,我希望收到通知。到目前为止,我通过WMI尝试了一下,但没有成功:

代码语言:javascript
复制
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_ROOTHKEY_CURRENT_USER配置单元的更改。(MSDN)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-21 04:01:32

我最终解决了这个问题,并使WMI查询版本正常工作:

代码语言:javascript
复制
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上发现了这个“黑客”

票数 14
EN

Stack Overflow用户

发布于 2010-11-21 00:43:40

上传到pastbin一个很好的类可以做到这一点。希望它能满足你的需求。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4233746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档