监控Windows注册表变化的简易类

在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显式地打开和关闭注册表键。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485