.NET Framework 提供 Microsoft.Win32.Registry 類別操作 Windows 註冊表。雖然無法直接建立/刪除根鍵或完整子樹,但可透過 CreateSubKey 與 SetValue 完成大多數常見的鍵值建立與修改操作。
CreateSubKey(string name, bool writable):建立或開啟子鍵,若不存在則創建。第二個參數指定是否可寫入。SetValue(string name, object value):設定鍵值。若鍵值存在則更新,不存在則創建。OpenSubKey(string name, bool writable):開啟現有子鍵。GetValue(string name)、GetSubKeyNames()、GetValueNames():讀取資料。功能:讀取 HARDWARE 下子鍵、建立子鍵/主鍵、修改指定鍵值。
using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.Win32;
public class RegForm : Form
{
private ListBox listBox1;
private Button btnRead, btnCreateSub, btnCreateMain, btnModify;
public RegForm()
{
InitializeComponent();
}
private void InitializeComponent()
{
listBox1 = new ListBox { Location = new Point(16, 32), Size = new Size(496, 264) };
btnRead = new Button { Text = "讀取註冊表", Location = new Point(16, 320), Size = new Size(90, 23) };
btnCreateSub = new Button { Text = "建立子鍵", Location = new Point(116, 320), Size = new Size(90, 23) };
btnCreateMain = new Button { Text = "建立主鍵", Location = new Point(216, 320), Size = new Size(90, 23) };
btnModify = new Button { Text = "修改鍵值", Location = new Point(316, 320), Size = new Size(90, 23) };
btnRead.Click += BtnRead_Click;
btnCreateSub.Click += BtnCreateSub_Click;
btnCreateMain.Click += BtnCreateMain_Click;
btnModify.Click += BtnModify_Click;
Controls.AddRange(new Control[] { listBox1, btnRead, btnCreateSub, btnCreateMain, btnModify });
Text = "C# 註冊表操作範例";
ClientSize = new Size(528, 357);
}
// 讀取 HARDWARE 下第一層子鍵與鍵值
private void BtnRead_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
using (var hklm = Registry.LocalMachine)
using (var hardware = hklm.OpenSubKey("HARDWARE"))
{
if (hardware == null) return;
foreach (var subKeyName in hardware.GetSubKeyNames())
{
listBox1.Items.Add(subKeyName);
using (var subKey = hardware.OpenSubKey(subKeyName))
{
foreach (var valName in subKey.GetValueNames())
{
listBox1.Items.Add($" {valName}: {subKey.GetValue(valName)}");
}
}
}
}
}
// 建立子鍵 HARDWARE\ddd 與鍵值 www=1234
private void BtnCreateSub_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
using (var hklm = Registry.LocalMachine)
using (var hardware = hklm.OpenSubKey("HARDWARE", true))
using (var ddd = hardware.CreateSubKey("ddd"))
{
ddd.SetValue("www", "1234");
listBox1.Items.Add("子鍵 ddd 與鍵值 www 建立完成");
}
}
// 建立主鍵結構 HARDWARE\main\sub 與鍵值 value=1234
private void BtnCreateMain_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
using (var hklm = Registry.LocalMachine)
using (var hardware = hklm.OpenSubKey("HARDWARE", true))
using (var main = hardware.CreateSubKey("main"))
using (var sub = main.CreateSubKey("sub"))
{
sub.SetValue("value", "1234");
listBox1.Items.Add("主鍵 main\\sub 與鍵值 value 建立完成");
}
}
// 修改現有鍵值 HARDWARE\aaa\bbb = abcd
private void BtnModify_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
using (var hklm = Registry.LocalMachine)
using (var hardware = hklm.OpenSubKey("HARDWARE", true))
using (var aaa = hardware.OpenSubKey("aaa", true))
{
if (aaa != null)
{
aaa.SetValue("bbb", "abcd");
listBox1.Items.Add("鍵值 bbb 已修改為 abcd");
}
else
{
listBox1.Items.Add("找不到 aaa 子鍵,請先手動建立");
}
}
}
[STAThread]
static void Main() => Application.Run(new RegForm());
}
LocalMachine 需管理員權限,建議應用程式清單設定 requireAdministrator。RegistryKey 實作 IDisposable,務必使用 using 區塊確保釋放。try-catch 處理 SecurityException、UnauthorizedAccessException 等。Registry.LocalMachine 預設為 64 位元視圖。需操作 32 位元視圖時,使用 RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)。subKey.DeleteValue("name")parentKey.DeleteSubKeyTree("subKeyName") (遞迴刪除)ManagementEventWatcher (WMI) 或輪詢機制。C# 操作註冊表 API 簡單直觀,但涉及系統核心設定,開發時務必嚴謹測試,並在生產環境謹慎部署。建議將註冊表操作封裝為專用服務類別,集中管理權限、日誌與錯誤處理。