C# 获取在c中触发RegNotifyChangeKeyValue时更改的注册表值#
我正在开发一个包装类来监视对特定注册表值的更改 我使用的是RegNotifyChangeKeyValue,因此每当更新regKey“Software\Bla”中的任何值时,它都会触发一个事件C# 获取在c中触发RegNotifyChangeKeyValue时更改的注册表值#,c#,winapi,registry,C#,Winapi,Registry,我正在开发一个包装类来监视对特定注册表值的更改 我使用的是RegNotifyChangeKeyValue,因此每当更新regKey“Software\Bla”中的任何值时,它都会触发一个事件 但我在“Software\Bla”中有多个值,因此如何监视单个值而不是全部值的更改?RegNotifyChangeKeyValue不允许这样做。它将返回(或触发事件,如果您异步使用它)任何满足其过滤器参数的键/子树更改。您可以重新读取所有值以查看到底更改了什么,或者使用WMI注册表监视程序而不是RegNot
但我在“Software\Bla”中有多个值,因此如何监视单个值而不是全部值的更改?
RegNotifyChangeKeyValue
不允许这样做。它将返回(或触发事件,如果您异步使用它)任何满足其过滤器参数的键/子树更改。您可以重新读取所有值以查看到底更改了什么,或者使用WMI注册表监视程序而不是RegNotifyChangeKeyValue
。有关更多信息,请参见下面的参考资料
这就是你需要做的, 步骤1: 打开注册表位置: RegOpenKeyEx(registryHive,registrySubName,0,标准权限|读取|键|查询|值|键|通知,输出注册表键) 步骤2: 查询注册表值 RegQueryValueEx(registryKey,registryValueName,0,引用类型,预设,引用大小) 步骤3: 缓存当前值。。 cachedValue=Marshal.PtrToStringAnsi(预设) 步骤4: 比较旧值和新值后引发注册表更改事件
try
{
AutoResetEvent _eventNotify = new AutoResetEvent(false);
WaitHandle[] waitHandles = new WaitHandle[]
{_eventNotify, eventTerminate };
while (!eventTerminate.WaitOne(0, true))
{
result = RegNotifyChangeKeyValue(registryKey, false, regFilter, _eventNotify.SafeWaitHandle, true);
if (WaitHandle.WaitAny(waitHandles) == 0)
{
retVal = RegQueryValueEx(registryKey, registryValueName, 0, ref type, pResult, ref size);
if (retVal == 0)
{
string currentValue = Marshal.PtrToStringAnsi(pResult);
if(!cachedValue.Equals(currentValue,StringComparison.InvariantCultureIgnoreCase))
{
OnRegistryChanged();
}
}
}
}
}
finally
{
if (registryKey != IntPtr.Zero)
{
RegCloseKey(registryKey);
}
}
编写此函数的目的是为了有效地实现它,而不是执行您想要执行的操作。它不会“触发”事件,而是发出事件的信号。您不知道哪个值,不知道更改了多少值,并且在事件发出信号后无法收到通知。谢谢,我的代码适用于windows xp&RegistryWatcher with WMI查询返回无效类。谢谢:)
RegistryValueChange
类在Vista及更高版本中受支持。看来,重读值以查看发生了什么变化是您唯一的方法。是否有完整的类?是的,@gooliver,代码可在