2009-05-05 23 views
18

WMI için bir yeni kullanıcıyım ve bir C# hizmetinde RegistryValueChangeEvent uygulamanız gerekiyor.Kayıt Cihazı Watcher C#

Her bir kayıt defteri değeri kümesinin her değiştiğinde tetiklenen bir olay işleyicisine ihtiyacım var. FileSystemWatcher sınıfının Changed etkinliğine benzer davranışı, ancak kayıt defteri değerleri için istiyorum.

Aynı görevi gerçekleştirmek için kullanabileceğim başka bir teknik varsa, bunu da takdir ediyorum. Benim asgari şartım, şu an sahip olduğumdan daha iyi bir çözüm olması: her 20 saniyede bir sorgulama ve kayıt defteri değerini son sonuçla karşılaştırmak.

Lütfen cevabınıza örnek bir kod verin. Sadece bir kayıt defteri değerini izlemek için bir örnek alabilirsem, bu iyi olurdu.

Ben teşekkür

.NET 2.0 bir çözüm gerekir.

cevap

24

WMI gibi RegNotifyChangeKeyValue sarmalayıcılarını kullanabilirsiniz Değilse Arıyorsunuz.

// --------------------------------------------------------------------------------------------------------------------- 
// <copyright file="Program.cs" company=""> 
// 
// </copyright> 
// <summary> 
// Defines the WmiChangeEventTester type. 
// </summary> 
// --------------------------------------------------------------------------------------------------------------------- 
namespace WmiExample 
{ 
    using System; 
    using System.Management; 

    /// <summary> 
    /// </summary> 
    public class WmiChangeEventTester 
    { 
     /// <summary> 
     /// Initializes a new instance of the <see cref="WmiChangeEventTester"/> class. 
     /// </summary> 
     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); 
      } 
     } 

     /// <summary> 
     /// </summary> 
     /// <param name="sender"> 
     /// The sender. 
     /// </param> 
     /// <param name="e"> 
     /// The e. 
     /// </param> 
     private void HandleEvent(object sender, EventArrivedEventArgs e) 
     { 
      Console.WriteLine("Received an event."); 
      // RegistryKeyChangeEvent occurs here; do something. 
     } 

     /// <summary> 
     /// </summary> 
     public static void Main() 
     { 
      // Just calls the class above to check for events... 
      WmiChangeEventTester receiveEvent = new WmiChangeEventTester(); 
     } 
    } 
} 
+0

Bu tam olarak aradığım şey. Bunu deneyeceğim ve nasıl çalıştığını size bildireceğim. –

+0

Harika, Andrew. Kendi kullanımınız için yeniden tasarlarken sorun yaşarsanız bana bildirin. İsterseniz AIM üzerinde ping yapabilirsiniz - e4lt0rf3R (harflerle rakamları değiştirin). Sahip olduğunuz ek soruları çözmenize yardımcı olmaktan mutluluk duyacağım ve daha sonra bunların bir özetini burada yayınlayacağım. –

+0

Bir "eski" cevabı yorumlamadığım için üzgünüm, ancak HKEY_CURRENT_USER – SomeNickName

3

WMI ile sınırlı mısınız? o Eğer buysa bazen ben sorunuzu anlıyorum ... çalışmak, böylece aşağıda kod parçacığı bir göz atın ve bana bildirin ilginç olabilir RegistryMonitor

+0

Hayır WMI ile sınırlı değilim, bu sadece gönderme sırasında bildiğim tek yöntem. Linkler için teşekkürler. Çok yardımcılar. Yine de bazı örnek kodlar verebilir misiniz? –

+1

Gerçekten o tembel Bu RegistryMonitor bağlantısını tıklayamazsınız ve zip dosyasını CodeProject dan indiremiyor musunuz? –

+2

Kaba olmayalım beyler. Örnek kod için sorulan soru; ayrıca, bazı bağlantıların eski haline geldiği ve örnek kodun öngörülebilir bir gelecekte burada arşivleneceği unutulmamalıdır. :) –

2

Başkalarının işaret ettiği gibi WMI'ye gerçekten ihtiyacınız yok. Ben de RegistryMonitor'u problemsiz kullanmıştım.

Bir örneğe ihtiyacınız varsa, sayfanın kendisinde RegistryMonitor için zaten örnek kod vardır. Kod projesinde aşağı kaydırdıysanız:

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

Evet Yaptım, ama ... ... sorumun şartlarını karşılamıyor. Belirli bir kayıt defteri _VALUE_ değiştirildiğinde tetiklenen bir etkinliğin örnek koduna ihtiyacım var; bir anahtar değil. Anlıyorum, bunu RegistryMonitor'dan alabilirim, ama birisi zamanımı kurtarmak isterse, kazanacak çok şeyleri vardır. –