【问题标题】:Receive notification when RegistryKey Value was changed当 RegistryKey 值更改时收到通知
【发布时间】:2010-11-20 16:36:11
【问题描述】:

我想要在 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

编辑2: RegistryEvent 或从它派生的类(例如 RegistryValueChangeEvent)不支持对 HKEY_CLASSES_ROOTHKEY_CURRENT_USER 配置单元的更改。 (MSDN)

【问题讨论】:

标签: c# registry wmi notifications wbem


【解决方案1】:

我终于解决了问题,让 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发现了这个“黑客”

【讨论】:

    【解决方案2】:

    上传到 pastbin 的一个不错的类可以做到这一点。希望它符合您的需求。

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

    【讨论】:

    • 这看起来像是来自 codeproject 的 RegistryMonitor 类,正如我在问题中提到的那样,它不符合我的需求,因为它会通知键中的任何值是否发生更改,而不仅仅是特定值是否更改...
    • @RoXX 你不能只遍历改变的值,看看你想要的那个是不是?
    • 我可以,但是还有很多其他值会发生变化,如果我可以像 wmi 查询一样在较低级别将它们过滤掉会很好,我正在寻找更好的解决方案。
    • 我再次查看了 codeproject 类,它没有提供任何关于 ValueName 在其事件中发生更改的信息,因此我必须手动检查我的密钥是否已更改,这将有巨大的性能影响,这使得这种方法对我来说毫无用处
    猜你喜欢
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 2010-10-20
    相关资源
    最近更新 更多