[C#] 登錄檔 Registry 操作心得筆記 (增、刪、讀、寫與搜尋)

紀錄 Windows 系統下登錄檔的 C# 操作處理

首先對 Windows 系統登錄檔結構做一簡單說明
登錄檔有五個主要個根節點,本文稱為基鍵(Root Key),如下:

  • HKEY_CLASSES_ROOT
  • HKEY_CURRENT_USER
  • HKEY_LOCAL_MACHINE
  • HKEY_USERS
  • HKEY_CURRENT_CONFIG

以上各有不同用途跟權限,這裡使用HKEY_CURRENT_USER,建議若還不了解各個用途前可以先以這個來測試
若遇到錯誤為UnauthorizedAccessException就是無權限操作

在基鍵下會有
機碼         - 如檔案總管內的目錄
登錄值組  - 如檔案總管內的檔案,內有值組名稱跟值組數值

大概知道以上分類後,就開始設計操作的功能,首先引用以下命名空間

using Microsoft.Win32;

然後宣告定義一個登錄檔物件,此處選HKEY_CURRENT_USER,路徑使用SOFTWARE\TEST\

public RegistryKey RegKey = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\TEST", true);

寫入一組值組,名稱Sample,內容值1st的字串

RegKey.SetValue("Sample1", "1st");

嘗試讀取並用對話框顯示出來,值組數值可以為字串/二進制值/DWORD/QWORD/多字串值/可擴充字串值,這裡不管是什麼只要不是NULL,就一律型轉成字串

string msg = RegKey.GetValue("Sample1")?.ToString();
MessageBox.Show("Name: Sample1\r\nValue: " + msg);

測試完以上後,就可以刪除此機碼

RegKey.DeleteSubKey("Sample1");

若該機碼下又有子機碼,要刪除層層機碼的話,就要用這個樹狀刪除功能

RegKey.DeleteSubKeyTree("Sample1");

上面分享了登錄檔的增、刪、讀、寫操作,另一個很常會應用到的就是搜索
搜索前提是要先取得該機碼內所有資料,主要會用到的是兩個

  • GetSubKeyNames
    取得機碼該層路徑下的所有子機碼名稱
  • GetValueNames
    取得機碼該層路徑下的所有登錄值組名稱

一樣引入命名空間,這裡宣告定義一個指定路徑的機碼物件

using Microsoft.Win32;

public RegistryKey RegKey = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\TEST", true);

這樣就可以使用上述兩個類別方法來取得所有名稱了

string msg = "Find out Key: \r\n";
foreach (string d in GetSubKeyNames())
{
    msg = msg + d + "\r\n";
}
MessageBox.Show(msg);
string msg = "Find out ValueName: \r\n";
foreach (string d in GetValueNames())
{
    msg = msg + d + "\r\n";
}
MessageBox.Show(msg);

用上面提到的讀取方法跟遞迴迴圈就可以層層往下找有沒有符合的字串數值了!

以上就是操作登錄檔常用到的功能方法,可以搭配來記錄程式相關的參數設定,不過要小心別去誤修改刪除到系統或其他應用程式的參數就是了!!