特定のreg値の変更を監視するためのラッパークラスの開発に取り組んでいます。RegNotifyChangeKeyValueがCでトリガされたときに変更されたレジストリ値を取得する
regKey "Software \ Bla"内の値が更新されるたびに、イベントが発生するたびにRegNotifyChangeKeyValueを使用しています。
しかし、私は "Software \ Bla"の中に複数の値を持っています。
特定のreg値の変更を監視するためのラッパークラスの開発に取り組んでいます。RegNotifyChangeKeyValueがCでトリガされたときに変更されたレジストリ値を取得する
regKey "Software \ Bla"内の値が更新されるたびに、イベントが発生するたびにRegNotifyChangeKeyValueを使用しています。
しかし、私は "Software \ Bla"の中に複数の値を持っています。
これは、あなたが何をする必要があるか ステップ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);
}
}
フルクラスはありますか? – GooliveR
RegNotifyChangeKeyValue
は許可しません。フィルタパラメータを満たすすべてのキー/サブツリーの変更に対して、それを返します(または、非同期に使用している場合はイベントを発生させます)。すべての値を変更して正確に何が変更されたかを確認するか、RegNotifyChangeKeyValue
の代わりにWMIレジストリウォッチャーを使用することができます。追加情報については、以下の参考文献を参照してください。
ありがとうございます、私のコードはWindows XP用です。レジストリウォッチャーでWMIクエリが返されます。無効なクラスです。ありがとう:) – User123456
'RegistryValueChange'クラスはVista以上でサポートされています。あなたの唯一のアプローチは、何が変わったのかを見直すということです。 – Ari0nhh
。それはイベントを "発射"しません、それはイベントを通知します。どの値が変わったか分からず、イベントが通知された後に通知を受け取ることができません。 –
[Example RegistryMonitor](https://dotblogs.com.tw/eaglewolf/2013/07/24/112158) – GooliveR