سؤال

وأنا مبتدئ إلى WMI ولست بحاجة لتنفيذ <وأ href = "http://msdn.microsoft.com/en-us/library/aa393042(VS.85).aspx" يختلط = "noreferrer" > RegistryValueChangeEvent في C # الخدمة.

وأنا بحاجة إلى معالج الحدث الذي يحصل تسبب في كل مرة يتم تغيير أي واحد من مجموعة من القيم التسجيل. أريد سلوك مماثل ل FileSystemWatcher الطبقة في <أ href ل = "http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.changed.aspx" يختلط = "noreferrer"> تغيير الحدث ، ولكن لقيم التسجيل.

وإذا كان هناك بعض تقنية أخرى أتمكن من استخدام لإنجاز نفس المهمة، ويهمني ان نقدر ذلك أيضا. بلدي الحد الأدنى من المتطلبات هو أنه يكون حلا أفضل من ما لدي الآن: الاقتراع كل 20 ثانية، وبمقارنة قيمة التسجيل مع نتيجة الماضية.

يرجى تقديم رمز المثال في إجابتك. إذا كنت أستطيع الحصول على سبيل المثال لمشاهدة قيمة التسجيل واحد فقط، من شأنه أن يكون على ما يرام.

وأنا في حاجة الى حل في صافي 2.0

وشكرا.

هل كانت مفيدة؟

المحلول

وWMI يمكن أن تكون أحيانا مثيرة للاهتمام للعمل مع ... أعتقد أنني أفهم سؤالك، حتى تأخذ نظرة على قصاصة الكود واسمحوا لي أن أعرف ما إذا كان هذا ما كنت أبحث عنه.

// --------------------------------------------------------------------------------------------------------------------- 
// <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();
        }
    }
}

نصائح أخرى

هل تقتصر على WMI؟ إذا لم تتمكن من استخدام مغلفة RegNotifyChangeKeyValue مثل <أ href = على "HTTP : //www.codeproject.com/Articles/4502/RegistryMonitor-a-NET-wrapper-class-for-RegNotifyC "يختلط =" نوفولو noreferrer "> 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 اتصال

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top