2010-11-20 21 views
6

HKEY_CURRENT_USERの特定のRegistryKeyが変更されたときに通知が必要です。 これまでのところ、私は成功しませんWMIを経由して、これを試してみました:私の第二のアプローチはhttp://msdn.microsoft.com/en-us/library/aa393042(VS.85).aspxからのC#に移植する目的で例をWBEM Scripting COM componentを使用していたRegistryKeyの値が変更されたときに通知を受け取ります。

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

(エラーは「見つかりません」された)が、私はWBEM COMの使用サンプルをC言語で見つけられませんでした。#

私はこのhttp://www.codeproject.com/KB/system/registrymonitor.aspxクラスを見つけましたが、このクラスはキー全体を監視するだけであり、特定の値(ValueNameで指定)上のサンプル)が変更されます。

編集: msdn vbscriptの例でHiveをHKEY_CURRENT_USERに変更すると、動作が停止します。このようRegistryValueChangeEventとして HKEY_CLASSES_ROOTへの変更とHKEY_CURRENT_USERじんましんがRegistryEventまたはそれから派生したクラスでサポートされていません、私はこの動作については何もなく、a link from 2003

EDIT2を見つけることができませんでした。 (MSDN

+0

で「ハック」私はあなたがコードのプロジェクトを変更することができると信じていましたどのキーが変更されたかを少なくとも知るために、複数の待機ハンドル/モニターを使用するコード。私は、モニターの意味がどういうものなのかよくわかりません - それほど悪くはありません:http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx :-) –

答えて

11

私は最終的に問題を解決し、動作するように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

0

それを行う良いクラスをpastbinにアップロードしました。あなたのニーズに合ってほしいと思っています。

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

+1

これは、特定のものが変更された場合だけでなく、キーの値が変更されたかどうかを通知するため、私の質問で言及したように私のニーズに合わないcodeprojectのRegistryMonitorクラスのように見えます... – RoXX

+0

@RoXXは反復できませんあなたが望んでいたものが変わったかどうかを確認してください。 –

+0

私は変更することができる他の多くの値があり、wmiクエリのような低レベルでそれらをフィルタリングすることができればうれしいでしょう。私はより良いソリューションを探しています。 – RoXX

関連する問題