在Windows操作系统中,注册表是存储系统设置和配置信息的关键部分。有时,需要监控注册表中特定键值的变化,以便在变化发生时执行某些操作。然而,.NET框架的Microsoft.Win32.RegistryKey
类并没有提供直接的方法来实现这一功能。因此,编写了一个简单的包装类RegistryMonitor
,用于实现注册表键值变化的通知功能。
要使用RegistryMonitor
类,首先需要实例化它。它提供了三种构造函数,参数列表如下:
RegistryMonitor(RegistryKey registryKey)
RegistryMonitor(string name)
RegistryMonitor(RegistryHive registryHive, string subKey)
这些构造函数允许指定要监控的注册表键。
RegistryMonitor
类支持两个事件:
public event EventHandler RegChanged;
public event ErrorEventHandler Error;
当在构造函数中指定的注册表键发生变化时,会触发RegChanged
事件。如果监控过程中发生异常,则会触发Error
事件。由于监控是在不同的线程中进行的,因此后者事件是必要的。
RegistryMonitor
类有一个属性:
public RegChangeNotifyFilter RegChangeNotifyFilter { get; set; }
RegChangeNotifyFilter
是一个枚举类型,用于控制检测到的注册表变化类型,例如仅检测键或值的变化。
RegistryMonitor
类有两个公共方法:
public void Start();
public void Stop();
这两个方法的用途非常直观,Start
方法创建一个单独的线程来监控注册表,而Stop
方法则停止该线程。
为了更直观地展示如何使用RegistryMonitor
类,下面是一个控制台程序示例,用于监控当前用户的环境变量(位于HKCU\Environment
):
public class MonitorSample {
static void Main() {
RegistryMonitor monitor = new RegistryMonitor(RegistryHive.CurrentUser, "Environment");
monitor.RegChanged += new EventHandler(OnRegChanged);
monitor.Start();
while (true);
monitor.Stop();
}
private void OnRegChanged(object sender, EventArgs e) {
Console.WriteLine("registry key has changed");
}
}
除了上述示例,还提供了一个WinForms应用程序的演示(使用VS.NET2003解决方案)。
最初版本的RegistryMonitor
类使用反射来获取Microsoft.Win32.RegistryKey
类的私有hkey
字段。然而,微软更改了内部实现,导致这种hack方法不再有效。因此,更改了实现方式,使得RegistryMonitor
现在使用P/Invoke显式地打开和关闭注册表键。