一个操作注册表的类

Windows 操作系统的注册表包含了很多有关计算机运行的配置方式,打开注册表我们可以看到注册表是按类似于目录的树结构组织的,其中第二级目录包含了五个预定义主键分别是:HKEY_CLASSES_ROOT,HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE,HKEY_USERS,HKEY_CURRENT_CONFIG。

  下面我们来分别解释这5个类的作用

  HKEY_CLASSES_ROOT该主键包含了文件的扩展名和应用程序的关联信息以及Window Shell和OLE用于储存注册表的信息。该主键下的子键决定了在WINDOWS中如何显示该类文件以及他们的图标,该主键是从HKEY_LCCAL_MACHINE/SOFTWARE/Classes映射过来的。

  HKEY_CURRENT_USER该主键包含了如用户窗口信息,桌面设置等当前用户的信息。

  HKEY_LOCAL_MACHINE主键包含了计算机软件和硬件的安装和配置信息,该信息可供所有用户使用
  HKEY_USERS该主键记录了当前用户的设置信息,每次用户登入系统时,就会在该主键下生成一个与用户登入名一样的子键,该子键保存了当前用户的桌面设置、背景位图、快捷键,字体等信息。一般应用程序不直接访问改主键,而是通过主键HKEY_CURRENT_USER进行访问。

  HKEY_CURRENT_CONFIG该主键保存了计算机当前硬件的配置信息,这些配置可以根据当前所连接的网络类型或硬件驱动软件安装的改变而改变。

  C#也支持对注册表的编辑,.NET框架在Microsoft.Win32名字空间中提供了两个类来操作注册表:Registry和RegistryKey。这两个类都是密封类不允许被继承。下面我们分别来介绍这两个类。

  Registry类提供了7个公共的静态域,分别代表7个基本主键(其中两个在XP系统中没有,在这就不介绍了)分别是:Registry.ClassesRoot,Registry.CurrentUser,Registry.LocalMachine,Registry.Users,Registry.CurrentConfig。它们分别对应哪几个键我想各位一看就会知道吧。

  RegistryKey类中提供了对注册表操作的方法。要注意的是操作注册表必须符合系统权限,否则将会抛出错误。

  下面我们就来几个操作注册表常用的几个方法

  创建子键的方法原型为:


  public RegistryKey CreateSubKey(string sunbkey);



  参数sunbkey表示要创建的子键的名称或路径名。创建成功返回被创建的子键,否则返回null。

  打开子键的方法原型为:


  public RegistryKey OpenSubKey(string name);
  public RegistryKey OpenSubKey(string name,bool writable);


  参数name表示要打开的子键名或其路径名,参数writable表示被打开的子键是否允许被修改,第一个方法打开的子键是只读的。Microsoft.Win32类还为我们提供了另一个方法,用于打开远程计算机上的注册表,方法原型为:


  public static RegistryKey OpenRemoteBaseKey(RegistryHive hKey,string machineName);


  删除子键的方法原型为:


  public void DeleteKey(string subkey);


  该方法用于删除指定的主键。如果要删除的子键还包含主键则删除失败,并返回一个异常,如果要彻底删除该子键极其目录下的子键可以用方法DeleteSubKeyTree,该方法原型如下:


  public void DeleteKeyTree(string subkey);


  读取键值的方法原型如下:


  public object GetValue(string name);
  public object GetValue(string name,object defaultValue);


  参数name表示键的名称,返回类型是一个object类型,如果指定的键不存在则返回null。如果失败又不希望返回的值是null则可以指定参数defaultValue,指定了参数则在读取失败的情况下返回该参数指定的值。

  设置键值的方法原型如下:


  public object SetValue(string name,object value);



 一个操作注册表的类

早上写了一个简单的操作注册表的类。
现在帖出来让大家帮我看看,有什么问题请联系我。

using System;
using Microsoft.Win32;

namespace PowerComponent
{
 /// <summary>
 /// 操作注册表
 /// </summary>
 public class Register
 {

  /// <summary>
  /// 实例构造函数
  /// </summary>
  public Register()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
  

  #region 公共方法

  /// <summary>
  /// 写入注册表,如果指定项已经存在,则修改指定项的值
  /// </summary>
  /// <param name="keytype">注册表基项枚举</param>
  /// <param name="key">注册表项,不包括基项</param>
  /// <param name="name">值名称</param>
  /// <param name="values">值</param>
  /// <returns>返回布尔值,指定操作是否成功</returns>
  public bool setValue(PowerComponent.Register.keyType keytype, string key, string name, string values)
  {
   try
   {
    RegistryKey rk = (RegistryKey)getRegistryKey(keytype);

    RegistryKey rkt = rk.CreateSubKey(key);
   
    if(rkt != null)
     rkt.SetValue(name, values);
    else
    {
     throw (new Exception("要写入的项不存在"));
    }

    return true;
   }
   catch
   {
    return false;
   }

  }

  
  /// <summary>
  /// 读取注册表
  /// </summary>
  /// <param name="keytype">注册表基项枚举</param>
  /// <param name="key">注册表项,不包括基项</param>
  /// <param name="name">值名称</param>
  /// <returns>返回字符串</returns>
  public string getValue(PowerComponent.Register.keyType keytype, string key, string name)
  {
   try
   {
    RegistryKey rk = (RegistryKey)getRegistryKey(keytype);

    RegistryKey rkt = rk.OpenSubKey(key);

    if(rkt != null)
     return rkt.GetValue(name).ToString();
    else
     throw(new Exception("无法找到指定项"));
   }
   catch(Exception ex)
   {
    return ex.Message;
   }

  }


  /// <summary>
  /// 删除注册表中的值
  /// </summary>
  /// <param name="keytype">注册表基项枚举</param>
  /// <param name="key">注册表项名称,不包括基项</param>
  /// <param name="name">值名称</param>
  /// <returns>返回布尔值,指定操作是否成功</returns>
  public bool deleteValue(PowerComponent.Register.keyType keytype, string key, string name)
  {
   try
   {
    RegistryKey rk = (RegistryKey)getRegistryKey(keytype);
    
    RegistryKey rkt = rk.OpenSubKey(key,true);

    if( rkt != null)
     rkt.DeleteValue(name,true);
    else
     throw(new Exception("无法找到指定项"));

    return true;

   }
   catch
   {
    return false;
   }
  }


  /// <summary>
  /// 删除注册表中的指定项
  /// </summary>
  /// <param name="keytype">注册表基项枚举</param>
  /// <param name="key">注册表中的项,不包括基项</param>
  /// <returns>返回布尔值,指定操作是否成功</returns>
  public bool deleteSubKey(PowerComponent.Register.keyType keytype, string key)
  {
   try
   {
    RegistryKey rk = (RegistryKey)getRegistryKey(keytype);

    rk.DeleteSubKeyTree(key);

    return true;

   }
   catch
   {
    return false;
   }
  }


  /// <summary>
  /// 判断指定项是否存在
  /// </summary>
  /// <param name="keytype">基项枚举</param>
  /// <param name="key">指定项字符串</param>
  /// <returns>返回布尔值,说明指定项是否存在</returns>
  public bool isExist(PowerComponent.Register.keyType keytype, string key)
  {
   RegistryKey rk = (RegistryKey)getRegistryKey(keytype);

   if(rk.OpenSubKey(key) == null)
    return false;
   else
    return true;
  }


  /// <summary>
  /// 检索指定项关联的所有值
  /// </summary>
  /// <param name="keytype">基项枚举</param>
  /// <param name="key">指定项字符串</param>
  /// <returns>返回指定项关联的所有值的字符串数组</returns>
  public string[] getValues(PowerComponent.Register.keyType keytype, string key)
  {
   RegistryKey rk = (RegistryKey)getRegistryKey(keytype);

   RegistryKey rkt = rk.OpenSubKey(key);

   if(rkt != null)
   {
   
    string[] names = rkt.GetValueNames();

    if(names.Length == 0)
     return names;
    else
    {
     string[] values = new string[names.Length];

     int i = 0;

     foreach(string name in names)
     {
      values[i] = rkt.GetValue(name).ToString();

      i++;
     }

     return values;

    }
   }
   else
   {
    throw (new Exception("指定项不存在"));
   }
   
  }

  #endregion

  #region 私有方法

  /// <summary>
  /// 返回RegistryKey对象
  /// </summary>
  /// <param name="keytype">注册表基项枚举</param>
  /// <returns></returns>
  private object getRegistryKey(PowerComponent.Register.keyType keytype)
  {
   RegistryKey rk = null;
   
   switch(keytype)
   {
    case keyType.HKEY_CLASS_ROOT:
     rk = Registry.ClassesRoot;
     break;
    case keyType.HKEY_CURRENT_USER:
     rk = Registry.CurrentUser;
     break;
    case keyType.HKEY_LOCAL_MACHINE:
     rk = Registry.LocalMachine;
     break;
    case keyType.HKEY_USERS:
     rk = Registry.Users;
     break;
    case keyType.HKEY_CURRENT_CONFIG:
     rk = Registry.CurrentConfig;
     break;
   }

   return rk;
  }

  #endregion  

  #region 枚举
  /// <summary>
  /// 注册表基项枚举
  /// </summary>
  public enum keyType:int
  {
   /// <summary>
   /// 注册表基项 HKEY_CLASSES_ROOT
   /// </summary>
   HKEY_CLASS_ROOT,
   /// <summary>
   /// 注册表基项 HKEY_CURRENT_USER
   /// </summary>
   HKEY_CURRENT_USER ,
   /// <summary>
   /// 注册表基项 HKEY_LOCAL_MACHINE
   /// </summary>
   HKEY_LOCAL_MACHINE ,
   /// <summary>
   /// 注册表基项 HKEY_USERS
   /// </summary>
   HKEY_USERS ,
   /// <summary>
   /// 注册表基项 HKEY_CURRENT_CONFIG
   /// </summary>
   HKEY_CURRENT_CONFIG 
  }
  #endregion

 }
}


以下从‘读’‘写’‘删除’‘判断’四个事例实现对注册表的简单操作
1.读取指定名称的注册表的值
 

 程序代码
private string GetRegistData(string name)
{
string registData;
RegistryKey hkml = Registry.LocalMachine;
RegistryKey software = hkml.OpenSubKey("SOFTWARE",true);
RegistryKey aimdir = software.OpenSubKey("XXX",true);
registData = aimdir.GetValue(name).ToString();
return registData;
}

以上是读取的注册表中HKEY_LOCAL_MACHINE/SOFTWARE目录下的XXX目录中名称为name的注册表值;

2.向注册表中写数据

 程序代码
private void WTRegedit(string name,string tovalue)
{
RegistryKey hklm = Registry.LocalMachine;
RegistryKey software = hklm.OpenSubKey("SOFTWARE",true);
RegistryKey aimdir = software.CreateSubKey("XXX");
aimdir.SetValue(name,tovalue);
}
以上是在注册表中HKEY_LOCAL_MACHINE/SOFTWARE目录下新建XXX目录并在此目录下创建名称为name值为tovalue的注册表项;

3.删除注册表中指定的注册表项

 程序代码
private void DeleteRegist(string name)
{
string[] aimnames;
RegistryKey hkml = Registry.LocalMachine;
RegistryKey software = hkml.OpenSubKey("SOFTWARE",true);
RegistryKey aimdir = software.OpenSubKey("XXX",true);
aimnames = aimdir.GetSubKeyNames();
foreach(string aimKey in aimnames)
{
if(aimKey == name)
aimdir.DeleteSubKeyTree(name);
}
}
以上是在注册表中HKEY_LOCAL_MACHINE/SOFTWARE目录下XXX目录中删除名称为name注册表项;

4.判断指定注册表项是否存在

 程序代码
private bool IsRegeditExit(string name)
{
bool _exit = false;
string[] subkeyNames;
RegistryKey hkml = Registry.LocalMachine;
RegistryKey software = hkml.OpenSubKey("SOFTWARE",true);
RegistryKey aimdir = software.OpenSubKey("XXX",true);
subkeyNames = aimdir.GetSubKeyNames();
foreach(string keyName in subkeyNames)
{
if(keyName == name)
{
_exit = true;
return _exit;
}
}
return _exit;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值