C#獲取登錄檔指定鍵值操作
某些程式必須依賴指定執行環境。那麼讀取登錄檔來判斷此電腦是否有執行環境是個很不錯的辦法。因為每個軟體安裝之後都會在登錄檔中註冊對應的鍵值,並且有些鍵值是獨一無二的。
那麼首先就需要找到那個具體的獨一無二的鍵值,以便程式在執行之前能夠去讀取以判斷。
程式碼如下:
class Program { private static string _sValue = string.Empty; static void Main(string[] args) { Console.WriteLine("請輸入待查詢值:"); _sValue = Console.ReadLine(); Console.WriteLine($"正在查詢。。。"); var registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32); //判斷機器位數 int i = 0; GetKeyNames(registryKey,ref i); Console.WriteLine($"查詢結束。。。"); Console.ReadKey(); } /// <summary> /// 遍歷所有子項 /// </summary> /// <param name="subkey">節點</param> /// <param name="i"></param> private static void GetKeyNames(RegistryKey subkey,ref int i) { foreach (var subkey_name in subkey.GetSubKeyNames()) // 檢索包含所有子項名稱的字串陣列 { try { using (RegistryKey csubkey = subkey.OpenSubKey(subkey_name)) { GetValueName(csubkey,ref i); GetKeyNames(csubkey,ref i); } } catch { } } } /// <summary> /// 若包含輸入值則輸出記錄 /// </summary> /// <param name="subkey">節點</param> /// <param name="i"></param> private static void GetValueName(RegistryKey subkey,ref int i) { foreach (var name in subkey.GetValueNames()) //檢索包含與此項關聯的所有值名稱的字串陣列 { var sValue = subkey.GetValue(name) + string.Empty; if (string.Compare(sValue,string.Format(@"{0}",_sValue,StringComparison.OrdinalIgnoreCase)) == 0) { Console.WriteLine(++i + "\t" + subkey.Name); } } } }
現在查詢含有E:\ArcGIS\Python27\ArcGISx6410.2\python.exe的鍵:
結果如下:
補充知識:利用C#訪問登錄檔獲取軟體的安裝路徑
絕大多數軟體,基本上都會在登錄檔中記錄自己的名字和安裝路徑資訊。
在登錄檔中記錄這些資訊的位置是:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
因此,我們只要能訪問到登錄檔的這個位置,就可以獲取到某些軟體的名稱和安裝路徑資訊。
本博文使用C#訪問登錄檔獲取軟體的安裝路徑並進行顯示。
1 示例程式主畫面說明
示例程式主畫面如下圖所示。
在畫面中的文字框中輸入可執行程式的名稱,點選“獲取路徑”按鈕,便會在畫面中的下一行(“獲取路徑”按鈕所在行的下一行)顯示出該程式完整的安裝路徑資訊。
這裡輸入的可執行檔名稱必須是程式在登錄檔中的名稱,如Adobe Reader在登錄檔中的名稱為“AcroRd32.exe”。
2 示例程式完整程式碼
using System; using System.Windows.Forms; using Microsoft.Win32; namespace GetSoftWarePathExp { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender,EventArgs e) { try { string softName = textBox1.Text.ToString(); string strKeyName = string.Empty; string softPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\"; RegistryKey regKey = Registry.LocalMachine; RegistryKey regSubKey = regKey.OpenSubKey(softPath + softName + ".exe",false); object objResult = regSubKey.GetValue(strKeyName); RegistryValueKind regValueKind = regSubKey.GetValueKind(strKeyName); if (regValueKind == Microsoft.Win32.RegistryValueKind.String) { this.label3.Text = objResult.ToString(); } } catch { this.label3.Text = "朋友,獲取程式路徑失敗!"; } } } }
注意:需要新增引用:using Microsoft.Win32;
3 程式碼說明
(1)程式碼“RegistryKey regKey = Registry.LocalMachine”使regKey 指向登錄檔主鍵HKEY_LOCAL_MACHINE。
(2)程式碼“RegistryKey regSubKey = regKey.OpenSubKey(softPath + softName + ".exe",false)”使regSubKey 指向我們需要查詢的登錄檔子健。
(3)程式碼“object objResult = regSubKey.GetValue(strKeyName)”獲取登錄檔的鍵值。
(4)程式碼“RegistryValueKind regValueKind = regSubKey.GetValueKind(strKeyName)”獲取登錄檔的鍵值型別。
(5)最後輸出獲取到的鍵值資訊。
(6)程式若出錯,輸出“朋友,獲取程式路徑失敗!”的提示資訊。
注意:RegistryKey.GetValue和RegistryKey.GetValueKind方法均需要傳入一個引數指示要檢索的值的名稱,當傳遞給RegistryKey.GetValue和RegistryKey.GetValueKind方法的引數為一個空字串時,則檢索的是一個未命名的值,在登錄檔編輯器中顯示此未命名的值時,將顯示字串“(Default)”,而不是顯示一個名稱。
在本例中,傳入的就是一個空字串,若以檢索軟體Adobe Reader的安裝資訊為例,則獲取的是下圖中的第一條登錄檔資訊,此時名稱項顯示字串“(預設)”。
4 程式執行結果
(1)獲取Adobe Reader的安裝路徑
輸入“AcroRd32”,點選“獲取路徑”,得到以下結果,是不是和登錄檔中記錄的資訊一致啊。
(2)獲取chrome的安裝路徑
輸入“chrome”,點選“獲取路徑”,得到以下結果,是不是和登錄檔中記錄的資訊一致啊。
5 多說兩句
在開發中,有時會指定特定程式來執行某類操作,這時可能會涉及讀取登錄檔資訊來開啟程式。只是有些程式可能不存在這樣的註冊資訊,這時,我們就必須採取其他方式了。
以上這篇C#獲取登錄檔指定鍵值操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。