Registry Watcher C#

我是WMI的新手,我需要在C#服务中实现RegistryValueChangeEvent 。

我需要一个事件处理程序,每次更改一组注册表值时都会触发该事件处理程序。 我想要的行为类似于FileSystemWatcher类的Changed事件,但是对于注册表值。

如果我可以使用其他一些技术来完成相同的任务,我也会很感激。 我的最低要求是它比我现在的解决方案更好:每20秒轮询一次,并将注册表值与最后结果进行比较。

请在答案中提供示例代码。 如果我只能看一个注册表值的示例,那就没问题了。

我需要一个.Net 2.0的解决方案

谢谢。

WMI有时候很有意思……我想我理解你的问题,所以看一下下面的代码片段,让我知道你是否正在寻找它。

// --------------------------------------------------------------------------------------------------------------------- //  // //  //  // Defines the WmiChangeEventTester type. //  // --------------------------------------------------------------------------------------------------------------------- namespace WmiExample { using System; using System.Management; ///  ///  public class WmiChangeEventTester { ///  /// Initializes a new instance of the  class. ///  public WmiChangeEventTester() { try { // Your query goes below; "KeyPath" is the key in the registry that you // want to monitor for changes. Make sure you escape the \ character. WqlEventQuery query = new WqlEventQuery( "SELECT * FROM RegistryValueChangeEvent WHERE " + "Hive = 'HKEY_LOCAL_MACHINE'" + @"AND KeyPath = 'SOFTWARE\\Microsoft\\.NETFramework' AND ValueName='InstallRoot'"); ManagementEventWatcher watcher = new ManagementEventWatcher(query); Console.WriteLine("Waiting for an event..."); // Set up the delegate that will handle the change event. watcher.EventArrived += new EventArrivedEventHandler(HandleEvent); // Start listening for events. watcher.Start(); // Do something while waiting for events. In your application, // this would just be continuing business as usual. System.Threading.Thread.Sleep(100000000); // Stop listening for events. watcher.Stop(); } catch (ManagementException managementException) { Console.WriteLine("An error occurred: " + managementException.Message); } } ///  ///  ///  /// The sender. ///  ///  /// The e. ///  private void HandleEvent(object sender, EventArrivedEventArgs e) { Console.WriteLine("Received an event."); // RegistryKeyChangeEvent occurs here; do something. } ///  ///  public static void Main() { // Just calls the class above to check for events... WmiChangeEventTester receiveEvent = new WmiChangeEventTester(); } } } 

你只限于WMI吗? 如果不是,您可以使用RegNotifyChangeKeyValue包装器,如RegistryMonitor

你真的不需要WMI,正如其他人所指出的那样。 我也没有使用过RegistryMonitor 。

如果您需要一个示例,那么页面本身已经有RegistryMonitor的示例代码。 您是否在代码项目中向下滚动到这一位:

 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"); } } 

您需要为它使用WMI。 请参阅http://msdn.microsoft.com/en-us/library/aa393035.aspx