2016-10-25 8 views
3

特定のreg値の変更を監視するためのラッパークラスの開発に取り組んでいます。RegNotifyChangeKeyValueがCでトリガされたときに変更されたレジストリ値を取得する

regKey "Software \ Bla"内の値が更新されるたびに、イベントが発生するたびにRegNotifyChangeKeyValueを使用しています。

しかし、私は "Software \ Bla"の中に複数の値を持っています。

+0

。それはイベントを "発射"しません、それはイベントを通知します。どの値が変わったか分からず、イベントが通知された後に通知を受け取ることができません。 –

+0

[Example RegistryMonitor](https://dotblogs.com.tw/eaglewolf/2013/07/24/112158) – GooliveR

答えて

3

これは、あなたが何をする必要があるか ステップ1: オープンレジストリの場所:

のRegOpenKeyEx(registryHive、レジスtrySubName、0、STANDARD_RIGHTS_READ | KEY_QUERY_VALUE | KEY_NOTIFY、レジストリキーから);

ステップ2: クエリREG値

RegQueryValueExの(のRegistryKey、registryValueName、0、REF型、PRESULT、refの大きさ)。

ステップ3: キャッシュ現在の値.. cachedValue = Marshal.PtrToStringAnsi(pResult);

ステップ4:新しい値で古い値を比較した後 火レジストリ変更イベント..

あなたがやりたいしない、効率的に実装できるように、この関数は書かれていた
  try 
     { 
      AutoResetEvent _eventNotify = new AutoResetEvent(false); 

      WaitHandle[] waitHandles = new WaitHandle[] 
      {_eventNotify, eventTerminate }; 

      while (!eventTerminate.WaitOne(0, true)) 
      { 
       result = RegNotifyChangeKeyValue(registryKey, false, regFilter, _eventNotify.SafeWaitHandle, true); 

       if (WaitHandle.WaitAny(waitHandles) == 0) 
       { 
        retVal = RegQueryValueEx(registryKey, registryValueName, 0, ref type, pResult, ref size); 
        if (retVal == 0) 
        { 
         string currentValue = Marshal.PtrToStringAnsi(pResult); 
         if(!cachedValue.Equals(currentValue,StringComparison.InvariantCultureIgnoreCase)) 
         { 
          OnRegistryChanged(); 
         } 
        } 
       } 
      } 
     } 
     finally 
     { 
      if (registryKey != IntPtr.Zero) 
      { 
       RegCloseKey(registryKey); 
      } 
     } 
+0

フルクラスはありますか? – GooliveR

1

RegNotifyChangeKeyValueは許可しません。フィルタパラメータを満たすすべてのキー/サブツリーの変更に対して、それを返します(または、非同期に使用している場合はイベントを発生させます)。すべての値を変更して正確に何が変更されたかを確認するか、RegNotifyChangeKeyValueの代わりにWMIレジストリウォッチャーを使用することができます。追加情報については、以下の参考文献を参照してください。

1. MSDN - Registry class

2. C# registry watcher

3. MSDN - Receiving WMI Event

4. CSMonitorRegistryChange sample code

+0

ありがとうございます、私のコードはWindows XP用です。レジストリウォッチャーでWMIクエリが返されます。無効なクラスです。ありがとう:) – User123456

+0

'RegistryValueChange'クラスはVista以上でサポートされています。あなたの唯一のアプローチは、何が変わったのかを見直すということです。 – Ari0nhh

関連する問題