Introduction
The Windows API provides a function RegNotifyChangeKeyValue
, which notifies the caller about changes to attributes or the content of a specified registry key. Unfortunately, this function is not provided by the Microsoft.Win32.RegistryKey
class. Because I needed that functionality, I've written a simple wrapper class.
Usage
Instantiation
RegistryMonitor
has three constructors, the parameter lists should be self-explanatory:
RegistryMonitor(RegistryKey registryKey)
RegistryMonitor(string name)
RegistryMonitor(RegistryHive registryHive, string subKey)
Events
RegistryMonitor
supports two events:
public event EventHandler RegChanged;
public event ErrorEventHandler Error;
The RegChanged
event is raised when the registry key specified during construction has changed. Error
is raised when an exception occurs.
The latter event is necessary because the monitoring is hosted in a different thread.
Properties
RegistryMonitor
has only one property:
public RegChangeNotifyFilter RegChangeNotifyFilter { get; set; }
RegChangeNotifyFilter
is an enum
. Since I don't want to repeat its implementation here in the article, I just want to say that it controls which kinds of registry changes will be detected, e.g. only key or value changes.
Methods
RegistryMonitor
has two public methods which are declared as follows:
public void Start();
public void Stop();
I don't think that these methods require much explanation. The former creates a separate thread, which will monitor the registry, and the latter will stop that thread.
Example
Because a simple example will say more than a thousand words, here's a console sample monitoring HKCU\Environment (that's where the current user's environment variables are stored):
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");
}
}
Provided with this article is another demo, which is a WinForms application (however, a VS.NET 2003 solution).
Points of interest
The first version of RegistryMonitor
used reflection to retrieve the private hkey
field of the Microsoft.Win32.RegistryKey
class. However, Microsoft changed the internal implementation, so this hack didn't work anymore (see the comments below). Therefore I changed my implementation, so that RegistryMonitor
now uses P/Invoke to open and close the registry key explicitly.
History
- 08-Jul-2003 - Initial release.
- 15-Jan-2005 - Updated to work for both .NET 1.1 and 2.0.