哪位知道C#如何操作注册表?
如查找键值,新建主键入健值,删除、修改等?
有没有简单的例子?
是新手?

解决方案 »

  1.   

    // RegistryKey k = Registry.CurrentUser;
    // RegistryKey k2=k.CreateSubKey("cc");
    // k.DeleteSubKey("bbb");
    // k.DeleteValue("cc");
    // k.CreateSubKey(@"cc\cc\cc"):
    // k2.SetValue("cc","3030");
      

  2.   

    在.Net FrameWork SDK Beta 2版中,有一个Microsoft.Win32的名称空间,在此名称空间中提供了二个用于注册表操作的类:Registry类、RegistryKey类。这二个类都是封闭类,不可以继承。在这二个类,定义了许多关于注册表的方法和属性,通过调用这二个类,在Visual C#中就可以比较轻松的处理关于注册表的各种操作了。 
    (1).Registry类: 
    此类主要封装了七个公有的静态域,而这些静态域分别代表这视窗注册表中的七个基本的主键,具体如下所示: 
    Registry.ClassesRoot 对应于HKEY_CLASSES_ROOT主键 
    Registry.CurrentUser 对应于HKEY_CURRENT_USER主键 
    Registry.LocalMachine 对应于 HKEY_LOCAL_MACHINE主键 
    Registry.User 对应于 HKEY_USER主键 
    Registry.CurrentConfig 对应于HEKY_CURRENT_CONFIG主键 
    Registry.DynDa 对应于HKEY_DYN_DATA主键 
    Registry.PerformanceData 对应于HKEY_PERFORMANCE_DATA主键 
    (2).RegistryKey类: 
    此类中主要封装了对视窗系统注册表的基本操作。在程序设计中,首先通过Registry类找到注册表中的基本主键,然后通过RegistryKey类,来找其下面的子键和处理具体的操作的。 三.通过一个读取注册表信息例子来具体说明这二个来的用法: (1).程序设计和运行的环境: 
    I视窗系统2000服务器版 II Net FrameWork SDK Beta 2版 
    (2)在运行程序前的一些必要的处理工作: 
    在程序设计时,主要功能是读取已经存在的主键键值,用户可以按照下图所示的结构新建若干个主键和对应的键值: 点击小图放大,图02:程序设计中要读取的注册表的信息 这里有必要说明的是上图只显示了"新项 #3"子键对应的键值。在"新项 #2"子键也有键值,对应的键值是:"新值#1"为"001","新值 #2"为"002"。在"新项 #1"子键中对应的键值是:"新值 #1"为"aaa","新值 #2"为"bbb"。 
    (3).程序的主要功能: 
    程序的主要功能是读取指定主键下面的所有子键和子键拥有的键值,并以列表的形式按层次显示出来,下图是本程序运行后界面: 点击小图放大,图03:读取注册表信息并以列表形式显示出来 (4).程序设计过程中的重要步骤以及应该注意的一些问题: I 程序中读取主键、子键和键值所使用到的方法: 
    程序中为了读取指定主键下面的子键和子键中拥有的键值,主要使用了RegistryKey类中的四个方法:OpenSubKey,GetSubKeyNames,GetValueNames,GetValue。具体的用法和意思如下: 
    OpenSubKey ( string name )方法主要是打开指定的子键。 
    GetSubKeyNames ( )方法是获得主键下面的所有子键的名称,它的返回值是一个字符串数组。 
    GetValueNames ( )方法是获得当前子键中的所有的键名称,它的返回值也是一个字符串数组。 
    GetValue ( string name )方法是指定键的键值。 
    程序中具体的使用语句如下: 
    RegistryKey hklm = Registry.LocalMachine ; 
    //打开"SYSTEM"子键 
    RegistryKey software = hklm.OpenSubKey ( "SYSTEM" ) ; 
    //打开"001"子键 
    RegistryKey no1 = software.OpenSubKey ( "001" ) ; 
    //打开"002"子键 
    RegistryKey no2 = no1.OpenSubKey ( "002" ) ; 
    其中listBox1是程序中定义了的列表名称。 
    II 如何用列表形式显示注册信息: 
    由于GetSubKeyNames ( )方法和GetValueNames ( )方法的返回值是字符串数组,所以在程序中是通过foreach语句实现遍历这些字符串数组的。并且在遍历的时候,就通过列表形式显示出来,程序中具体实现语句如下: 
    foreach ( string site in no2.GetSubKeyNames ( ) ) 
    //开始遍历由子键名称组成的字符串数组 

    listBox1.Items.Add ( site ) ; 
    //在列表中加入子键名称 
    RegistryKey sitekey = no2.OpenSubKey ( site ) ; 
    //打开此子键 
    foreach ( string sValName in sitekey.GetValueNames ( ) ) 
    //开始遍历由指定子键拥有的键值名称组成的字符串数组 

    listBox1.Items.Add ( "" + sValName + ": " + sitekey.GetValue ( sValName ) ) ; 
    //在列表中加入键名称和对应的键值 


    (5).源程序代码: 
    通过以上的论述,我们可以得到程序的源程序代码,具体如下: 
    using System ; 
    using System.Drawing ; 
    using System.Collections ; 
    using System.ComponentModel ; 
    using System.Windows.Forms ; 
    using System.Data ; 
    using Microsoft.Win32 ; public class Form1 : Form 

    private System.ComponentModel.Container components ; 
    private ListBox listBox1 ; 
    private Button button1 ; 
    public Form1 ( ) 

    InitializeComponent ( ) ; 

    //清除在程序中使用过的资源 
    public override void Dispose ( ) 

    base.Dispose ( ) ; 
    components.Dispose ( ) ; 

    //初始化程序中使用到的组件 
    private void InitializeComponent ( ) 

    this.components = new System.ComponentModel.Container ( ) ; 
    this.button1 = new Button ( ) ; 
    this.listBox1 = new ListBox ( ) ; 
    button1.Location = new System.Drawing.Point ( 16 , 320 ) ; 
    button1.Size = new System.Drawing.Size ( 75 , 23 ) ; 
    button1.TabIndex = 0 ; 
    button1.Text = "读取注册表" ; 
    button1.Click += new System.EventHandler( this.button1_Click ) ; 
    listBox1.Location = new System.Drawing.Point ( 16 , 32 ) ; 
    listBox1.Size = new System.Drawing.Size ( 496 , 264 ) ; 
    listBox1.TabIndex = 1 ; 
    this.Text = "读取主测表信息" ; 
    this.AutoScaleBaseSize = new System.Drawing.Size ( 5 , 13 ) ; 
    this.ClientSize = new System.Drawing.Size ( 528 , 357 ) ; 
    this.Controls.Add( this.listBox1 ) ; 
    this.Controls.Add ( this.button1 ) ; 

    protected void button1_Click ( object sender , System.EventArgs e ) 

    listBox1.Items.Clear ( ) ; 
    RegistryKey hklm = Registry.LocalMachine ; 
    RegistryKey software = hklm.OpenSubKey ( "SYSTEM" ) ; 
    //打开"SYSTEM"子键 
    RegistryKey no1 = software.OpenSubKey ( "001" ) ; 
    //打开"001"子键 
    RegistryKey no2 = no1.OpenSubKey ( "002" ) ; 
    //打开"002"子键 
    foreach ( string site in no2.GetSubKeyNames ( ) ) 
    //开始遍历由子键名称组成的字符串数组 

    listBox1.Items.Add ( site ) ; 
    //在列表中加入子键名称 
    RegistryKey sitekey = no2.OpenSubKey ( site ) ; 
    //打开此子键 
    foreach ( string sValName in sitekey.GetValueNames ( ) ) 
    //开始遍历由指定子键拥有的键值名称组成的字符串数组 

    listBox1.Items.Add ( "" + sValName + ": " + sitekey.GetValue ( sValName ) ) ; 
    //在列表中加入键名称和对应的键值 



    public static void Main ( ) 

    Application.Run ( new Form1 ( ) ) ; 


    四.总结: 
    用Visual C#来读取注册表中的注册信息是通过名称空间Micorsoft.Win32中的二个类来实现的。在这二个类中还定义了对注册表信息的删除、修改和重命名的一些方法。这些方法比起本文介绍的读取方法、打开方法来说,更具有破坏性,但也更实用。对应这些方法的介绍将在以后的文章中进行。 
    通过以上的介绍,我们发现用Visual C#来处理注册表,其实是一件比较轻松而简单的事情。事情虽然是轻松的,但我也要提醒各位,由于注册表在视窗系统中的重要作用,所以在每一次对注册表进行操作之前,一定要备份,在操作的时候也要非常小心,因为你的每一次的误操作都可能导致你的系统崩溃。  
     C#调用WMI获取本机MAC地址列表。 
    private void button1_Click(object sender, System.EventArgs e) 
            { 
                string strsearch=string.Format(@"SELECT MACAddress FROM Win32_NetworkAdapter WHERE ((MACAddress Is Not NULL)AND (Manufacturer <> 'Microsoft'))"); 
     
                System.Management.ManagementObjectSearcher msearch=new ManagementObjectSearcher();  
                msearch.Scope=new ManagementScope(@"root\CIMV2"); 
                msearch.Query=new ObjectQuery(strsearch); 
                int i=1; 
                try 
                { 
                    if((msearch.Get().Count<1) || (msearch.Get()==null)) 
                    { 
                        this.listBox1.Items.Add("No MAC Address!"); 
                    } 
                    else 
                    { 
                        foreach(System.Management.ManagementObject mymac in msearch.Get()) 
                        { 
                            string str1=string.Format("MAC{0} address:{1}",i.ToString(),mymac["MACAddress"].ToString()); 
                            this.listBox1.Items.Add(str1); 
                            i++; 
                        } 
                    } 
                } 
                catch(Exception ex) 
                { 
                    string msg=ex.Message.ToString(); 
                    MessageBox.Show("erro", msg); 
                } 
     
            }
      

  3.   

    读注册表,例如读取IEXPLORE的路径
    RegistryKey readIexplorePath;
    readIexplorePath=Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\IEXPLORE.EXE",true);
    string path=Convert.ToString(readIexplorePath.GetValue(""));写注册表,position是一个string,如"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\IEXPLORE.EXE",key是一个string,例如"Path"或者"",value也是一个string,是你要设定的值
    if(Registry.CurrentUser.OpenSubKey(position,true)!=null)
    {
    RegistryKey regWrite;
    regWrite = Registry.CurrentUser.CreateSubKey(position);
    regWrite.SetValue(key,value);
    regWrite.Close();
    }
      

  4.   

    没事说的很好。对于我们这些新手来说。一看就明白了。
    但我不知道我在vs2003中可不可以用呀!
    MS又出2.0版本。
    真累呀!1.1还没有学会。2.0又出来了。
      

  5.   

    我想把读取的值输出到ListBox中应如何写?
     hoking3210(风) 中给出的读取例子。
    ListBox=pach;
    吗?应调用ListBox的哪一个属性呢?
      

  6.   

    ArrayList USStates = new ArrayList()    ;
      ListBox1.DataSource = USStates ;
      

  7.   

    但读取到的值是存在path
    的呀!
    ArrayList USStates = new ArrayList()    ;
      ListBox1.DataSource = USStates USStates如何得到这个值呢?
    ListBox1.DataSource=path行不行呀?