7

HKEY_CURRENT_USERの特定のRegistryKeyが変更されたときに通知が必要です。これまでのところ、私はこれを試しましWMIたが成功しませんでした:

var query = new WqlEventQuery(string.Format(
"SELECT * FROM RegistryKeyChangeEvent WHERE Hive='{0}' AND KeyPath='{1}' AND ValueName='{2}'",
                hive, keyPath.Replace("\\","\\\\"), valueName));
_watcher = new ManagementEventWatcher(query);
_watcher.Scope.Path.NamespacePath = @"root\default";
_watcher.EventArrived += (sender, args) => KeyValueChanged();
_watcher.Start();

(エラーは「見つかりません」でした)

2番目のアプローチは、例をhttp://msdn.microsoft.com/en-us/library/aa393042(VS.85).aspxからc#WBEM Scripting COM componentに移植することを目的としてを使用することでしたが、 c#のWBEM COM

このhttp://www.codeproject.com/KB/system/registrymonitor.aspxクラスを見つけましたが、このクラスはキー全体を監視するだけであり、特定の値(指定された場合)の場合にのみ通知が必要なため、ニーズに適合しませんでしたValueName上記のサンプルのを介して)が変更されます。

編集:HKEY_CURRENT_USERmsdn vbscriptの例でハイブをに変更すると、動作を停止します。この動作については何も見つかりませんでしたが、2003年からのリンクです

EDIT2:HKEY_CLASSES_ROOTおよびハイブへの変更は、またはそれから派生したクラス(など)HKEY_CURRENT_USERではサポートされていません。(MSDNRegistryEventRegistryValueChangeEvent

4

2 に答える 2

14

私はついに問題を解決し、WMIクエリバージョンを機能させました。

var currentUser = WindowsIdentity.GetCurrent();
var query = new WqlEventQuery(string.Format(
"SELECT * FROM RegistryValueChangeEvent WHERE Hive='HKEY_USERS' AND KeyPath='{0}\\\\{1}' AND ValueName='{2}'",
currentUser.User.Value, keyPath.Replace("\\","\\\\"), valueName));
_watcher = new ManagementEventWatcher(query);
_watcher.EventArrived += (sender, args) => KeyValueChanged();
_watcher.Start();

この「ハック」はhttp://www.codeproject.com/Messages/2844468/Monitoring-HKEY_CURRENT_USER.aspxで見つかりました

于 2010-11-20T20:01:31.847 に答える
0

それを行う素晴らしいクラスをpastbinにアップロードしました。それがあなたのニーズに合うことを願っています。

http://www.csharp.pastebin.com/0reFh6v2

于 2010-11-20T16:43:39.697 に答える