Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取在c中触发RegNotifyChangeKeyValue时更改的注册表值#_C#_Winapi_Registry - Fatal编程技术网

C# 获取在c中触发RegNotifyChangeKeyValue时更改的注册表值#

C# 获取在c中触发RegNotifyChangeKeyValue时更改的注册表值#,c#,winapi,registry,C#,Winapi,Registry,我正在开发一个包装类来监视对特定注册表值的更改 我使用的是RegNotifyChangeKeyValue,因此每当更新regKey“Software\Bla”中的任何值时,它都会触发一个事件 但我在“Software\Bla”中有多个值,因此如何监视单个值而不是全部值的更改?RegNotifyChangeKeyValue不允许这样做。它将返回(或触发事件,如果您异步使用它)任何满足其过滤器参数的键/子树更改。您可以重新读取所有值以查看到底更改了什么,或者使用WMI注册表监视程序而不是RegNot

我正在开发一个包装类来监视对特定注册表值的更改

我使用的是RegNotifyChangeKeyValue,因此每当更新regKey“Software\Bla”中的任何值时,它都会触发一个事件


但我在“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,代码可在