首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 註冊表操作完整指南:建立、修改與讀取鍵值

     編輯:關於C#

前言

.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():讀取資料。

實作範例:WinForms 註冊表管理工具

功能:讀取 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());
}

關鍵注意事項

  1. 權限:寫入 LocalMachine 需管理員權限,建議應用程式清單設定 requireAdministrator。
  2. 資源釋放:RegistryKey 實作 IDisposable,務必使用 using 區塊確保釋放。
  3. 例外處理:實際專案需加入 try-catch 處理 SecurityException、UnauthorizedAccessException 等。
  4. 32/64 位元視圖:64 位元系統下,Registry.LocalMachine 預設為 64 位元視圖。需操作 32 位元視圖時,使用 RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)。

進階操作

  • 刪除鍵值:subKey.DeleteValue("name")
  • 刪除子鍵:parentKey.DeleteSubKeyTree("subKeyName") (遞迴刪除)
  • 監聽變更:使用 ManagementEventWatcher (WMI) 或輪詢機制。

結語

C# 操作註冊表 API 簡單直觀,但涉及系統核心設定,開發時務必嚴謹測試,並在生產環境謹慎部署。建議將註冊表操作封裝為專用服務類別,集中管理權限、日誌與錯誤處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved