2010-11-20 50 views
6

我想要在HKEY_CURRENT_USER中的特定RegistryKey發生更改時發出通知。 到目前爲止,我通過WMI沒有成功嘗試這樣做:當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 Scripting COM component的意圖,端口的例子從http://msdn.microsoft.com/en-us/library/aa393042(VS.85).aspx到C#,但我沒有找到任何使用示例的WBEM COM在c#

我發現這個http://www.codeproject.com/KB/system/registrymonitor.aspx類,但它不符合我的需要,因爲這個類只監視整個鍵,我只想要一個通知,當一個特定的值(通過t中的ValueName指定)他上面的樣品)得到改變。

編輯: 如果您在msdn vbscript示例中將Hive更改爲HKEY_CURRENT_USER,它將停止工作。我無法找到有關此問題的任何東西,但a link from 2003

EDIT2: 更改到HKEY_CLASSES_ROOTHKEY_CURRENT_USER蕁麻疹不被從它衍生RegistryEvent或類,如RegistryValueChangeEvent支持。 (MSDN

+0

我相信你可以修改代碼項目代碼使用多個等待句柄/監視器來至少告訴哪個鍵已被改變。我不確定n顯示器的含義是什麼 - 看起來並不那麼糟糕:http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx :-) – 2010-11-20 19:11:00

回答

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 2010-11-20 16:50:19

+0

@RoXX你不能只是迭代通過改變的價值觀,看看你想要的那個是否做到了? – 2010-11-20 17:35:23

+0

我可以但還有很多其他值會發生變化,如果我可以像wmi查詢那樣在較低級別過濾它們會更好,我正在尋找更好的解決方案。 – RoXX 2010-11-20 17:47:52

相關問題