2016-12-30 20 views
2

我想讀的是在廣東話getValueNames()從HKEY_LOCAL_MACHINE SOFTWARE 微軟的Windows CurrentVersion Run中

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

我想與做這一切值了註冊表以下代碼:

RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", false); 
     string[] values = key.GetValueNames(); 

但我的值字符串總是空的。 有關有趣的是,如果我改變了代碼以

RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion", false); 
     string[] values = key.GetValueNames(); 

我得到CURRENTVERSION ValueNames的正確的金額。爲什麼它在\ Run中不起作用? 如果我從LocalMachine更改爲CurrentUser,\ Run路徑也起作用。

RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", false); 
     string[] values = key.GetValueNames(); 

有人能告訴我爲什麼我的第一個CodeExample不起作用嗎?謝謝!

+0

無法重現該問題。你的第一個例子適合我。你有沒有在獨立的測試程序中測試它?也許這是你的真實代碼中的一些奇怪的情況... –

+0

剛剛做到了。同樣的問題再次。但謝謝你的答案。 – Luca

回答

0

您不提供有關您的C#應用​​程序是32位(x86)還是64位(x64)的詳細信息。如果應用程序在64位Windows上運行32位,則註冊表調用HKLM\Software將重定向到HKLM\Software\Wow6432Node。微軟稱這是Registry Redirector。只有某些鍵被重定向,細節位於鏈接文章中。

如果您的應用程序是64位的,則這些註冊表調用不會重定向。

你可以通過在HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run手動添加一個名爲「TestWOW」的REG_SZ條目來測試。您的32位代碼應該讀取此值(即使您實際上要求另一個註冊表項!)。

如果可以,請將您的應用程序重新編譯爲64位。現在相同的代碼將返回HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run的期望值。

不幸的是,我不知道有一種機制來強制Windows不要將您的註冊表調用重定向到64位操作系統上運行的32位應用程序的Wow64節點。

相關問題