using System; using System.Runtime.InteropServices; class RegistryTester { const int INFINITE = -1; const long HKEY_LOCAL_MACHINE = 0x80000002L; const long REG_NOTIFY_CHANGE_LAST_SET = 0x00000004L; [DllImport("kernel32.dll", EntryPoint="CreateEvent")] static extern IntPtr CreateEvent(IntPtr eventAttributes, bool manualReset, bool initialState, String name); [DllImport("advapi32.dll", EntryPoint="RegOpenKey")] static extern IntPtr RegOpenKey(IntPtr key, String subKey, out IntPtr resultSubKey); [DllImport("advapi32.dll", EntryPoint="RegNotifyChangeKeyValue")] static extern long RegNotifyChangeKeyValue(IntPtr key, bool watchSubTree, int notifyFilter, IntPtr regEvent, bool async); [DllImport("kernel32.dll", EntryPoint="WaitForSingleObject")] static extern long WaitForSingleObject(IntPtr handle, int timeOut); [DllImport("kernel32.dll", EntryPoint="CloseHandle")] static extern IntPtr CloseHandle(IntPtr handle); public static void Main(String[] args) { IntPtr myKey; IntPtr myEvent = CreateEvent((IntPtr)null, false, false, null); if (args.Length < 1) { Console.WriteLine("Usage: RegistryTester KEY"); return; } String key = args[0]; unchecked { RegOpenKey(new IntPtr((int)HKEY_LOCAL_MACHINE), key, out myKey); } RegNotifyChangeKeyValue(myKey, true, (int)REG_NOTIFY_CHANGE_LAST_SET, myEvent, true); Console.WriteLine("Waiting on " + key + "..."); WaitForSingleObject(myEvent, INFINITE); Console.WriteLine(key + " has been modified."); CloseHandle(myEvent); } }