Chcę otrzymać powiadomienie, gdy określony klucz rejestru w zmiennej HKEY_CURRENT_USER
został zmieniony. Do tej pory próbowałem to poprzez WMI
bez powodzenia:Otrzymuj powiadomienie, gdy wartość klucza rejestru została zmieniona
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();
(Error „nie znaleziono”)
Drugie podejście było za pomocą WBEM Scripting COM component
z zamiarem portu przykład z http://msdn.microsoft.com/en-us/library/aa393042(VS.85).aspx do C#, ale Nie znalazłem próbek użycia dla WBEM COM w C#
Znalazłem tę klasę http://www.codeproject.com/KB/system/registrymonitor.aspx, ale nie pasowało to do moich potrzeb, ponieważ ta klasa monitoruje tylko cały klucz i chcę tylko powiadomienie, gdy określona wartość (określone przez ValueName
wt próbki powyżej) zostaje zmieniony.
EDYCJA: Po zmianie ula na HKEY_CURRENT_USER
w przykładzie msdn vbscript, przestaje działać. Nie mogłem znaleźć nic na temat tego zachowania, ale a link from 2003
EDIT2: Zmiany HKEY_CLASSES_ROOT
i HKEY_CURRENT_USER
uli nie są obsługiwane przez RegistryEvent
lub klas pochodnych od niego, takich jak RegistryValueChangeEvent
. (MSDN)
Wierzę, że można zmodyfikować kod-project kod do używania wielu uchwytów oczekiwania/monitorów dla wszystkich, którzy najmniej mówią, który klucz został zmieniony. Nie jestem pewien, jakie są implikacje n monitorów - nie wygląda to tak źle: http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx :-) –