HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

A Registry megváltozásának figyelése


Példaprogram letöltése

9891 bájt

A Windows DLL-jeiben nagyon sok metódust találunk, melyek funkcionalitása nincs implementálva a .NET Framework menedzselt környezetében. Ennek értelmében, ha ezek használatára van szükségünk, akkor ezeket magunknak kell deklarálnunk a megfelelő módon. Ezt tesszük azzal a metódussal is, melynek segítségével a Rendszerleíró adatbázis egy tetszőleges kulcsának megváltozását figyelhetjük alkalmazásainkból.

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.

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2003 évkönyv 798. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |