レジストリウォッチャーC#
-
05-07-2019 - |
質問
私はWMIの初心者であり、 C#サービスのRegistryValueChangeEvent 。
レジストリ値のセットのいずれかが変更されるたびにトリガーされるイベントハンドラーが必要です。 FileSystemWatcher クラスの Changed イベント、ただしレジストリ値用。
同じタスクを達成するために使用できる他の手法があれば、それも感謝します。私の最小要件は、現在のソリューションよりも優れたソリューションであることです。20秒ごとにポーリングし、レジストリ値を最後の結果と比較します。
回答にサンプルコードを入力してください。 1つのレジストリ値のみを監視する例を得ることができれば、それは問題ありません。
.Net 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に制限されていますか?
そうでない場合は、
他の人が指摘しているように、あなたは本当に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