A Registry egy adott kulcsát az ADVAPI32.DLL-ben megtalálható RegNotifyChangeKeyValue metódus segítségével figyelhetjük, ennek a megadott kulcsnak a változásáról ad értesítést a metódus. A változás lehet egy kulcs létrehozása, illetve törlése, vagy valamilyen bejegyzés elhelyezése a kulcs alatt, illetve ennek törlése onnan.
A metódus menedzselt deklarációja a következő:

RegNotifyChangeKeyValue
Int32 RegNotifyChangeKeyValue(
IntPtr hKey,
bool bWatchSubtree,
Filter dwNotifyFilter,
IntPtr hEvent,
bool fAsynchronous
);
Paraméterek
IntPtr hKey
Egy mutató segítségével adhatjuk meg a figyelendő kulcsot, mely egy tetszőleges kulcs lehet, vagy valamely előre definiált kulcs, melyeket a következő konstansok azonosítanak:
- HKEY_CLASSES_ROOT
- HKEY_CURRENT_CONFIG
- HKEY_CURRENT_USER
- HKEY_LOCAL_MACHINE
- HKEY_USERS
bool bWatchSubtree
Jelezhetjük egy logikai értékkel, hogy a kulcs alkulcsait is szeretnénk figyelni, vagy csak magát a kulcsot.
Filter dwNotifyFilter
Konstansok – jelen esetben egy felsorolt típus elemeinek segítségével adható meg, hogy milyen típusú változás esetén jelezzen a metódus. A lehetséges értékek a következők:
- REG_NOTIFY_CHANGE_NAME: amennyiben egy kulcsot adtunk a kulcshoz, vagy töröltünk egyet onnan
- REG_NOTIFY_CHANGE_ATTRIBUTES: a kulcs attribútumok megváltozása esetében jelez a metódus
- REG_NOTIFY_CHANGE_LAST_SET: ha a bejegyzés értéke törlődik, vagy létrejön egy új érték
IntPtr hEvent
A létrehozott esemény.
bool fAsynchronous
A jelzés szinkron, vagy aszinkron módjára utal, TRUE esetén azonnal értesítést kapunk a változásról.
Visszatérési érték
Sikeres végrehajtás esetében nulla.
A mellékelt példa Detector osztálya tartalmazza a metódus deklarációját, és a művelet végrehajtásának kódját. Az osztályban deklarálunk egy eseményt, mely bekövetkezik a változáskor.
public event EventHandler ChangedEvent;
Az osztály property-jei a következők:
- RegistryKey: a megadott Rendszerleíró adatbázisbeli kulcs, melyet figyelünk
- Running: fut-e a figyelés, vagy sem.
- NotifyFilter: a megadott szempontokat tartalmazza
Az osztály GetHandle metódusában képezzük a RegistryKey property-ben megadott kulcs pointerét, melyet az API metódusnak átadunk.
public static IntPtr GetHandle(RegistryKey rk)
{
Type type = rk.GetType();
FieldInfo fi = type.GetField("hkey", BindingFlags.Instance | BindingFlags.NonPublic);
return (IntPtr)fi.GetValue(rk);
}
Az Execute metódusban elindítunk egy szálat, mely futtatja a figyelő algoritmust.
if (!Running)
{
eTerminate.Reset();
th = new Thread(new ThreadStart(NLoop));
th.IsBackground = true;
th.Start();
}
A NLoop metódus fut egészen a szál leállításáig, és meghívja a WaitForAction metódust, mely elsüti az eseményt abban az esetben, ha a kulcs változik.
while (!eTerminate.WaitOne(0, true))
{
if (WaitForAction())
{
if (ChangedEvent != null)
ChangedEvent(this, EventArgs.Empty);
}
}
A Stop metódussal állíthatjuk le a műveletet.
eTerminate.Set();
th.Join();
th = null;
Az alkalmazás két nyomógombjával indíthatjuk, illetve állíthatjuk le a figyelést. A szövegmezőben kell megadnunk a figyelendő kulcsot, miután kiválasztottuk a főkulcsot a ComboBox kontrolban.