• C# 注册表操作类(完整版)winform


    1 ///<summary>
    2     /// 注册表基项静态域
    3
        ///
    4
        /// 主要包括:
    5
        /// 1.Registry.ClassesRoot     对应于HKEY_CLASSES_ROOT主键
    6
        /// 2.Registry.CurrentUser     对应于HKEY_CURRENT_USER主键
    7
        /// 3.Registry.LocalMachine    对应于 HKEY_LOCAL_MACHINE主键
    8
        /// 4.Registry.User            对应于 HKEY_USER主键
    9
        /// 5.Registry.CurrentConfig   对应于HEKY_CURRENT_CONFIG主键
    10
        /// 6.Registry.DynDa           对应于HKEY_DYN_DATA主键
    11
        /// 7.Registry.PerformanceData 对应于HKEY_PERFORMANCE_DATA主键
    12
        ///
    13
        /// 版本:1.0
    14
        ///</summary>
    15      publicenum RegDomain
    16
        {
    17
            ///<summary>
    18         /// 对应于HKEY_CLASSES_ROOT主键
    19
            ///</summary>
    20         ClassesRoot =0,
    21
            ///<summary>
    22         /// 对应于HKEY_CURRENT_USER主键
    23
            ///</summary>
    24         CurrentUser =1,
    25
            ///<summary>
    26         /// 对应于 HKEY_LOCAL_MACHINE主键
    27
            ///</summary>
    28         LocalMachine =2,
    29
            ///<summary>
    30         /// 对应于 HKEY_USER主键
    31
            ///</summary>
    32         User =3,
    33
            ///<summary>
    34         /// 对应于HEKY_CURRENT_CONFIG主键
    35
            ///</summary>
    36         CurrentConfig =4,
    37
            ///<summary>
    38         /// 对应于HKEY_DYN_DATA主键
    39
            ///</summary>
    40         DynDa =5,
    41
            ///<summary>
    42         /// 对应于HKEY_PERFORMANCE_DATA主键
    43
            ///</summary>
    44         PerformanceData =6,
    45
        }

     2.指定在注册表中存储值时所用的数据类型,或标识注册表中某个值的数据类型

    1 ///<summary>
    2 /// 指定在注册表中存储值时所用的数据类型,或标识注册表中某个值的数据类型
    3 ///
    4 /// 主要包括:
    5 /// 1.RegistryValueKind.Unknown
    6 /// 2.RegistryValueKind.String
    7 /// 3.RegistryValueKind.ExpandString
    8 /// 4.RegistryValueKind.Binary
    9 /// 5.RegistryValueKind.DWord
    10 /// 6.RegistryValueKind.MultiString
    11 /// 7.RegistryValueKind.QWord
    12 ///
    13 /// 版本:1.0
    14 ///</summary>
    15 publicenum RegValueKind
    16 {
    17 ///<summary>
    18 /// 指示一个不受支持的注册表数据类型。例如,不支持 Microsoft Win32 API 注册表数据类型 REG_RESOURCE_LIST。使用此值指定
    19 ///</summary>
    20 Unknown =0,
    21 ///<summary>
    22 /// 指定一个以 Null 结尾的字符串。此值与 Win32 API 注册表数据类型 REG_SZ 等效。
    23 ///</summary>
    24 String =1,
    25 ///<summary>
    26 /// 指定一个以 NULL 结尾的字符串,该字符串中包含对环境变量(如 %PATH%,当值被检索时,就会展开)的未展开的引用。
    27 /// 此值与 Win32 API注册表数据类型 REG_EXPAND_SZ 等效。
    28 ///</summary>
    29 ExpandString =2,
    30 ///<summary>
    31 /// 指定任意格式的二进制数据。此值与 Win32 API 注册表数据类型 REG_BINARY 等效。
    32 ///</summary>
    33 Binary =3,
    34 ///<summary>
    35 /// 指定一个 32 位二进制数。此值与 Win32 API 注册表数据类型 REG_DWORD 等效。
    36 ///</summary>
    37 DWord =4,
    38 ///<summary>
    39 /// 指定一个以 NULL 结尾的字符串数组,以两个空字符结束。此值与 Win32 API 注册表数据类型 REG_MULTI_SZ 等效。
    40 ///</summary>
    41 MultiString =5,
    42 ///<summary>
    43 /// 指定一个 64 位二进制数。此值与 Win32 API 注册表数据类型 REG_QWORD 等效。
    44 ///</summary>
    45 QWord =6,
    46 }

      3.注册表操作类

    1 ///<summary>
    2 /// 注册表操作类
    3 ///
    4 /// 主要包括以下操作:
    5 /// 1.创建注册表项
    6 /// 2.读取注册表项
    7 /// 3.判断注册表项是否存在
    8 /// 4.删除注册表项
    9 /// 5.创建注册表键值
    10 /// 6.读取注册表键值
    11 /// 7.判断注册表键值是否存在
    12 /// 8.删除注册表键值
    13 ///
    14 /// 版本:1.0
    15 ///</summary>
    16 publicclass Register
    17 {
    18 #region 字段定义
    19 ///<summary>
    20 /// 注册表项名称
    21 ///</summary>
    22 privatestring _subkey;
    23 ///<summary>
    24 /// 注册表基项域
    25 ///</summary>
    26 private RegDomain _domain;
    27 ///<summary>
    28 /// 注册表键值
    29 ///</summary>
    30 privatestring _regeditkey;
    31 #endregion
    32
    33 #region 属性
    34 ///<summary>
    35 /// 设置注册表项名称
    36 ///</summary>
    37 publicstring SubKey
    38 {
    39 //get { return _subkey; }
    40 set { _subkey = value; }
    41 }
    42
    43 ///<summary>
    44 /// 注册表基项域
    45 ///</summary>
    46 public RegDomain Domain
    47 {
    48 ///get { return _domain; }
    49 set { _domain = value; }
    50 }
    51
    52 ///<summary>
    53 /// 注册表键值
    54 ///</summary>
    55 publicstring RegeditKey
    56 {
    57 ///get{return _regeditkey;}
    58 set { _regeditkey = value; }
    59 }
    60 #endregion
    61
    62 #region 构造函数
    63 public Register()
    64 {
    65 ///默认注册表项名称
    66 _subkey ="software\\";
    67 ///默认注册表基项域
    68 _domain = RegDomain.LocalMachine;
    69 }
    70
    71 ///<summary>
    72 /// 构造函数
    73 ///</summary>
    74 ///<param name="subKey">注册表项名称</param>
    75 ///<param name="regDomain">注册表基项域</param>
    76 public Register(string subKey, RegDomain regDomain)
    77 {
    78 ///设置注册表项名称
    79 _subkey = subKey;
    80 ///设置注册表基项域
    81 _domain = regDomain;
    82 }
    83 #endregion
    84
    85 #region 公有方法
    86 #region 创建注册表项
    87 ///<summary>
    88 /// 创建注册表项,默认创建在注册表基项 HKEY_LOCAL_MACHINE下面(请先设置SubKey属性)
    89 /// 虚方法,子类可进行重写
    90 ///</summary>
    91 publicvirtualvoid CreateSubKey()
    92 {
    93 ///判断注册表项名称是否为空,如果为空,返回false
    94 if (_subkey ==string.Empty || _subkey ==null)
    95 {
    96 return;
    97 }
    98
    99 ///创建基于注册表基项的节点
    100 RegistryKey key = GetRegDomain(_domain);
    101
    102 ///要创建的注册表项的节点
    103 RegistryKey sKey;
    104 if (!IsSubKeyExist())
    105 {
    106 sKey = key.CreateSubKey(_subkey);
    107 }
    108 //sKey.Close();
    109 ///关闭对注册表项的更改
    110 key.Close();
    111 }
    112
    113 ///<summary>
    114 /// 创建注册表项,默认创建在注册表基项 HKEY_LOCAL_MACHINE下面
    115 /// 虚方法,子类可进行重写
    116 /// 例子:如subkey是software\\higame\\,则将创建HKEY_LOCAL_MACHINE\\software\\higame\\注册表项
    117 ///</summary>
    118 ///<param name="subKey">注册表项名称</param>
    119 publicvirtualvoid CreateSubKey(string subKey)
    120 {
    121 ///判断注册表项名称是否为空,如果为空,返回false
    122 if (subKey ==string.Empty || subKey ==null)
    123 {
    124 return;
    125 }
    126
    127 ///创建基于注册表基项的节点
    128 RegistryKey key = GetRegDomain(_domain);
    129
    130 ///要创建的注册表项的节点
    131 RegistryKey sKey;
    132 if (!IsSubKeyExist(subKey))
    133 {
    134 sKey = key.CreateSubKey(subKey);
    135 }
    136 //sKey.Close();
    137 ///关闭对注册表项的更改
    138 key.Close();
    139 }
    140
    141 ///<summary>
    142 /// 创建注册表项,默认创建在注册表基项 HKEY_LOCAL_MACHINE下面
    143 /// 虚方法,子类可进行重写
    144 ///</summary>
    145 ///<param name="regDomain">注册表基项域</param>
    146 publicvirtualvoid CreateSubKey(RegDomain regDomain)
    147 {
    148 ///判断注册表项名称是否为空,如果为空,返回false
    149 if (_subkey ==string.Empty || _subkey ==null)
    150 {
    151 return;
    152 }
    153
    154 ///创建基于注册表基项的节点
    155 RegistryKey key = GetRegDomain(regDomain);
    156
    157 ///要创建的注册表项的节点
    158 RegistryKey sKey;
    159 if (!IsSubKeyExist(regDomain))
    160 {
    161 sKey = key.CreateSubKey(_subkey);
    162 }
    163 //sKey.Close();
    164 ///关闭对注册表项的更改
    165 key.Close();
    166 }
    167
    168 ///<summary>
    169 /// 创建注册表项(请先设置SubKey属性)
    170 /// 虚方法,子类可进行重写
    171 /// 例子:如regDomain是HKEY_LOCAL_MACHINE,subkey是software\\higame\\,则将创建HKEY_LOCAL_MACHINE\\software\\higame\\注册表项
    172 ///</summary>
    173 ///<param name="subKey">注册表项名称</param>
    174 ///<param name="regDomain">注册表基项域</param>
    175 publicvirtualvoid CreateSubKey(string subKey, RegDomain regDomain)
    176 {
    177 ///判断注册表项名称是否为空,如果为空,返回false
    178 if (subKey ==string.Empty || subKey ==null)
    179 {
    180 return;
    181 }
    182
    183 ///创建基于注册表基项的节点
    184 RegistryKey key = GetRegDomain(regDomain);
    185
    186 ///要创建的注册表项的节点
    187 RegistryKey sKey;
    188 if (!IsSubKeyExist(subKey, regDomain))
    189 {
    190 sKey = key.CreateSubKey(subKey);
    191 }
    192 //sKey.Close();
    193 ///关闭对注册表项的更改
    194 key.Close();
    195 }
    196 #endregion
    197
    198 #region 判断注册表项是否存在
    199 ///<summary>
    200
    200         /// 判断注册表项是否存在,默认是在注册表基项HKEY_LOCAL_MACHINE下判断(请先设置SubKey属性)
     201         /// 虚方法,子类可进行重写
     202         /// 例子:如果设置了Domain和SubKey属性,则判断Domain\\SubKey,否则默认判断HKEY_LOCAL_MACHINE\\software\\
     203         /// </summary>
     204         /// <returns>返回注册表项是否存在,存在返回true,否则返回false</returns>
     205         public virtual bool IsSubKeyExist()
     206         {
     207             ///判断注册表项名称是否为空,如果为空,返回false
     208             if (_subkey == string.Empty || _subkey == null)
     209             {
     210                 return false;
     211             }
     212 
     213             ///检索注册表子项
     214             ///如果sKey为null,说明没有该注册表项不存在,否则存在
     215             RegistryKey sKey = OpenSubKey(_subkey, _domain);
     216             if (sKey == null)
     217             {
     218                 return false;
     219             }
     220             return true;
     221         }
     222 
     223         /// <summary>
     224         /// 判断注册表项是否存在,默认是在注册表基项HKEY_LOCAL_MACHINE下判断
     225         /// 虚方法,子类可进行重写
     226         /// 例子:如subkey是software\\higame\\,则将判断HKEY_LOCAL_MACHINE\\software\\higame\\注册表项是否存在
     227         /// </summary>
     228         /// <param name="subKey">注册表项名称</param>
     229         /// <returns>返回注册表项是否存在,存在返回true,否则返回false</returns>
     230         public virtual bool IsSubKeyExist(string subKey)
     231         {
     232             ///判断注册表项名称是否为空,如果为空,返回false
     233             if (subKey == string.Empty || subKey == null)
     234             {
     235                 return false;
     236             }
     237 
     238             ///检索注册表子项
     239             ///如果sKey为null,说明没有该注册表项不存在,否则存在
     240             RegistryKey sKey = OpenSubKey(subKey);
     241             if (sKey == null)
     242             {
     243                 return false;
     244             }
     245             return true;
     246         }
     247 
     248         /// <summary>
     249         /// 判断注册表项是否存在
     250         /// 虚方法,子类可进行重写
     251         /// 例子:如regDomain是HKEY_CLASSES_ROOT,则将判断HKEY_CLASSES_ROOT\\SubKey注册表项是否存在
     252         /// </summary>
     253         /// <param name="regDomain">注册表基项域</param>
     254         /// <returns>返回注册表项是否存在,存在返回true,否则返回false</returns>
     255         public virtual bool IsSubKeyExist(RegDomain regDomain)
     256         {
     257             ///判断注册表项名称是否为空,如果为空,返回false
     258             if (_subkey == string.Empty || _subkey == null)
     259             {
     260                 return false;
     261             }
     262 
     263             ///检索注册表子项
     264             ///如果sKey为null,说明没有该注册表项不存在,否则存在
     265             RegistryKey sKey = OpenSubKey(_subkey, regDomain);
     266             if (sKey == null)
     267             {
     268                 return false;
     269             }
     270             return true;
     271         }
     272 
     273         /// <summary>
     274         /// 判断注册表项是否存在(请先设置SubKey属性)
     275         /// 虚方法,子类可进行重写
     276         /// 例子:如regDomain是HKEY_CLASSES_ROOT,subkey是software\\higame\\,则将判断HKEY_CLASSES_ROOT\\software\\higame\\注册表项是否存在
     277         /// </summary>
     278         /// <param name="subKey">注册表项名称</param>
     279         /// <param name="regDomain">注册表基项域</param>
     280         /// <returns>返回注册表项是否存在,存在返回true,否则返回false</returns>
     281         public virtual bool IsSubKeyExist(string subKey, RegDomain regDomain)
     282         {
     283             ///判断注册表项名称是否为空,如果为空,返回false
     284             if (subKey == string.Empty || subKey == null)
     285             {
     286                 return false;
     287             }
     288 
     289             ///检索注册表子项
     290             ///如果sKey为null,说明没有该注册表项不存在,否则存在
     291             RegistryKey sKey = OpenSubKey(subKey, regDomain);
     292             if (sKey == null)
     293             {
     294                 return false;
     295             }
     296             return true;
     297         }
     298         #endregion
     299 
     300         #region 删除注册表项
     301         /// <summary>
     302         /// 删除注册表项(请先设置SubKey属性)
     303         /// 虚方法,子类可进行重写
     304         /// </summary>
     305         /// <returns>如果删除成功,则返回true,否则为false</returns>
     306         public virtual bool DeleteSubKey()
     307         {
     308             ///返回删除是否成功
     309             bool result = false;
     310 
     311             ///判断注册表项名称是否为空,如果为空,返回false
     312             if (_subkey == string.Empty || _subkey == null)
     313             {
     314                 return false;
     315             }
     316 
     317             ///创建基于注册表基项的节点
     318             RegistryKey key = GetRegDomain(_domain);
     319 
     320             if (IsSubKeyExist())
     321             {
     322                 try
     323                 {
     324                     ///删除注册表项
     325                     key.DeleteSubKey(_subkey);
     326                     result = true;
     327                 }
     328                 catch
     329                 {
     330                     result = false;
     331                 }
     332             }
     333             ///关闭对注册表项的更改
     334             key.Close();
     335             return result;
     336         }
     337 
     338         /// <summary>
     339         /// 删除注册表项(请先设置SubKey属性)
     340         /// 虚方法,子类可进行重写
     341         /// </summary>
     342         /// <param name="subKey">注册表项名称</param>
     343         /// <returns>如果删除成功,则返回true,否则为false</returns>
     344         public virtual bool DeleteSubKey(string subKey)
     345         {
     346             ///返回删除是否成功
     347             bool result = false;
     348 
     349             ///判断注册表项名称是否为空,如果为空,返回false
     350             if (subKey == string.Empty || subKey == null)
     351             {
     352                 return false;
     353             }
     354 
     355             ///创建基于注册表基项的节点
     356             RegistryKey key = GetRegDomain(_domain);
     357 
     358             if (IsSubKeyExist())
     359             {
     360                 try
     361                 {
     362                     ///删除注册表项
     363                     key.DeleteSubKey(subKey);
     364                     result = true;
     365                 }
     366                 catch
     367                 {
     368                     result = false;
     369                 }
     370             }
     371             ///关闭对注册表项的更改
     372             key.Close();
     373             return result;
     374         }
     375 
     376         /// <summary>
     377         /// 删除注册表项
     378         /// 虚方法,子类可进行重写
     379         /// </summary>
     380         /// <param name="subKey">注册表项名称</param>
     381         /// <param name="regDomain">注册表基项域</param>
     382         /// <returns>如果删除成功,则返回true,否则为false</returns>
     383         public virtual bool DeleteSubKey(string subKey, RegDomain regDomain)
     384         {
     385             ///返回删除是否成功
     386             bool result = false;
     387 
     388             ///判断注册表项名称是否为空,如果为空,返回false
     389             if (subKey == string.Empty || subKey == null)
     390             {
     391                 return false;
     392             }
     393 
     394             ///创建基于注册表基项的节点
     395             RegistryKey key = GetRegDomain(regDomain);
     396 
     397             if (IsSubKeyExist(subKey, regDomain))
     398             {
     399                 try
     400                 {
     401                     ///删除注册表项
     402                     key.DeleteSubKey(subKey);
     403                     result = true;
     404                 }
     405                 catch
     406                 {
     407                     result = false;
     408                 }
     409             }
     410             ///关闭对注册表项的更改
     411             key.Close();
     412             return result;
     413         }
     414         #endregion
     415 
     416         #region 判断键值是否存在
     417         /// <summary>
     418         /// 判断键值是否存在(请先设置SubKey和RegeditKey属性)
     419         /// 虚方法,子类可进行重写
     420         /// 1.如果RegeditKey为空、null,则返回false
     421         /// 2.如果SubKey为空、null或者SubKey指定的注册表项不存在,返回false
     422         /// </summary>
     423         /// <returns>返回键值是否存在,存在返回true,否则返回false</returns>
     424         public virtual bool IsRegeditKeyExist()
     425         {
     426             ///返回结果
     427             bool result = false;
     428 
     429             ///判断是否设置键值属性
     430             if (_regeditkey == string.Empty || _regeditkey == null)
     431             {
     432                 return false;
     433             }
     434 
     435             ///判断注册表项是否存在
     436             if (IsSubKeyExist())
     437             {
     438                 ///打开注册表项
     439                 RegistryKey key = OpenSubKey();
     440                 ///键值集合
     441                 string[] regeditKeyNames;
     442                 ///获取键值集合
     443                 regeditKeyNames = key.GetValueNames();
     444                 ///遍历键值集合,如果存在键值,则退出遍历
     445                 foreach (string regeditKey in regeditKeyNames)
     446                 {
     447                     if (string.Compare(regeditKey, _regeditkey, true) == 0)
     448                     {
     449                         result = true;
     450                         break;
     451                     }
     452                 }
     453                 ///关闭对注册表项的更改
     454                 key.Close();
     455             }
     456             return result;
     457         }
     458 
     459         /// <summary>
     460         /// 判断键值是否存在(请先设置SubKey属性)
     461         /// 虚方法,子类可进行重写
     462         /// 如果SubKey为空、null或者SubKey指定的注册表项不存在,返回false
     463         /// </summary>
     464         /// <param name="name">键值名称</param>
     465         /// <returns>返回键值是否存在,存在返回true,否则返回false</returns>
     466         public virtual bool IsRegeditKeyExist(string name)
     467         {
     468             ///返回结果
     469             bool result = false;
     470 
     471             ///判断是否设置键值属性
     472             if (name == string.Empty || name == null)
     473             {
     474                 return false;
     475             }
     476 
     477             ///判断注册表项是否存在
     478             if (IsSubKeyExist())
     479             {
     480                 ///打开注册表项
     481                 RegistryKey key = OpenSubKey();
     482                 ///键值集合
     483                 string[] regeditKeyNames;
     484                 ///获取键值集合
     485                 regeditKeyNames = key.GetValueNames();
     486                 ///遍历键值集合,如果存在键值,则退出遍历
     487                 foreach (string regeditKey in regeditKeyNames)
     488                 {
     489                     if (string.Compare(regeditKey, name, true) == 0)
     490                     {
     491                         result = true;
     492                         break;
     493                     }
     494                 }
     495                 ///关闭对注册表项的更改
     496                 key.Close();
     497             }
     498             return result;
     499         }
     500 
     501         /// <summary>
     502         /// 判断键值是否存在
     503         /// 虚方法,子类可进行重写
     504         /// </summary>
     505         /// <param name="name">键值名称</param>
     506         /// <param name="subKey">注册表项名称</param>
     507         /// <returns>返回键值是否存在,存在返回true,否则返回false</returns>
     508         public virtual bool IsRegeditKeyExist(string name, string subKey)
     509         {
     510             ///返回结果
     511             bool result = false;
     512 
     513             ///判断是否设置键值属性
     514             if (name == string.Empty || name == null)
     515             {
     516                 return false;
     517             }
     518 
     519             ///判断注册表项是否存在
     520             if (IsSubKeyExist())
     521             {
     522                 ///打开注册表项
     523                 RegistryKey key = OpenSubKey(subKey);
     524                 ///键值集合
     525                 string[] regeditKeyNames;
     526                 ///获取键值集合
     527                 regeditKeyNames = key.GetValueNames();
     528                 ///遍历键值集合,如果存在键值,则退出遍历
     529                 foreach (string regeditKey in regeditKeyNames)
     530                 {
     531                     if (string.Compare(regeditKey, name, true) == 0)
     532                     {
     533                         result = true;
     534                         break;
     535                     }
     536                 }
     537                 ///关闭对注册表项的更改
     538                 key.Close();
     539             }
     540             return result;
     541         }
     542 
     543         /// <summary>
     544         /// 判断键值是否存在
     545         /// 虚方法,子类可进行重写
     546         /// </summary>
     547         /// <param name="name">键值名称</param>
     548         /// <param name="subKey">注册表项名称</param>
     549         /// <param name="regDomain">注册表基项域</param>
     550         /// <returns>返回键值是否存在,存在返回true,否则返回false</returns>
     551         public virtual bool IsRegeditKeyExist(string name, string subKey, RegDomain regDomain)
     552         {
     553             ///返回结果
     554             bool result = false;
     555 
     556             ///判断是否设置键值属性
     557             if (name == string.Empty || name == null)
     558             {
     559                 return false;
     560             }
     561 
     562             ///判断注册表项是否存在
     563             if (IsSubKeyExist())
     564             {
     565                 ///打开注册表项
     566                 RegistryKey key = OpenSubKey(subKey, regDomain);
     567                 ///键值集合
     568                 string[] regeditKeyNames;
     569                 ///获取键值集合
     570                 regeditKeyNames = key.GetValueNames();
     571                 ///遍历键值集合,如果存在键值,则退出遍历
     572                 foreach (string regeditKey in regeditKeyNames)
     573                 {
     574                     if (string.Compare(regeditKey, name, true) == 0)
     575                     {
     576                         result = true;
     577                         break;
     578                     }
     579                 }
     580                 ///关闭对注册表项的更改
     581                 key.Close();
     582             }
     583             return result;
     584         }
     585         #endregion
     586 
     587         #region 设置键值内容
     588         /// <summary>
     589         /// 设置指定的键值内容,不指定内容数据类型(请先设置RegeditKey和SubKey属性)
     590         /// 存在改键值则修改键值内容,不存在键值则先创建键值,再设置键值内容
     591         /// </summary>
     592         /// <param name="content">键值内容</param>
     593         /// <returns>键值内容设置成功,则返回true,否则返回false</returns>
     594         public virtual bool WriteRegeditKey(object content)
     595         {
     596             ///返回结果
     597             bool result = false;
     598 
     599             ///判断是否设置键值属性
     600             if (_regeditkey == string.Empty || _regeditkey == null)
     601             {
     602                 return false;
     603             }
     604 
     605             ///判断注册表项是否存在,如果不存在,则直接创建
     606             if (!IsSubKeyExist(_subkey))
     607             {
     608                 CreateSubKey(_subkey);
     609             }
     610 
     611             ///以可写方式打开注册表项
     612             RegistryKey key = OpenSubKey(true);
     613 
     614             ///如果注册表项打开失败,则返回false
     615             if (key == null)
     616             {
     617                 return false;
     618             }
     619 
     620             try
     621             {
     622                 key.SetValue(_regeditkey, content);
     623                 result = true;
     624             }
     625             catch
     626             {
     627                 result = false;
     628             }
     629             finally
     630             {
     631                 ///关闭对注册表项的更改
     632                 key.Close();
     633             }
     634             return result;
     635         }
     636 
     637         /// <summary>
     638         /// 设置指定的键值内容,不指定内容数据类型(请先设置SubKey属性)
     639         /// 存在改键值则修改键值内容,不存在键值则先创建键值,再设置键值内容
     640         /// </summary>
     641         /// <param name="name">键值名称</param>
     642         /// <param name="content">键值内容</param>
     643         /// <returns>键值内容设置成功,则返回true,否则返回false</returns>
     644         public virtual bool WriteRegeditKey(string name, object content)
     645         {
     646             ///返回结果
     647             bool result = false;
     648 
     649             ///判断键值是否存在
     650             if (name == string.Empty || name == null)
     651             {
     652                 return false;
     653             }
     654 
     655             ///判断注册表项是否存在,如果不存在,则直接创建
     656             if (!IsSubKeyExist(_subkey))
     657             {
     658                 CreateSubKey(_subkey);
     659             }
     660 
     661             ///以可写方式打开注册表项
     662             RegistryKey key = OpenSubKey(true);
     663 
     664             ///如果注册表项打开失败,则返回false
     665             if (key == null)
     666             {
     667                 return false;
     668             }
     669 
     670             try
     671             {
     672                 key.SetValue(name, content);
     673                 result = true;
     674             }
     675             catch (Exception ex)
     676             {
     677                 result = false;
     678             }
     679             finally
     680             {
     681                 ///关闭对注册表项的更改
     682                 key.Close();
     683             }
     684             return result;
     685         }
     686 
     687         /// <summary>
     688         /// 设置指定的键值内容,指定内容数据类型(请先设置SubKey属性)
     689         /// 存在改键值则修改键值内容,不存在键值则先创建键值,再设置键值内容
     690         /// </summary>
     691         /// <param name="name">键值名称</param>
     692         /// <param name="content">键值内容</param>
     693         /// <returns>键值内容设置成功,则返回true,否则返回false</returns>
     694         public virtual bool WriteRegeditKey(string name, object content, RegValueKind regValueKind)
     695         {
     696             ///返回结果
     697             bool result = false;
     698 
     699             ///判断键值是否存在
     700             if (name == string.Empty || name == null)
     701             {
     702                 return false;
     703             }
     704 
     705             ///判断注册表项是否存在,如果不存在,则直接创建
     706             if (!IsSubKeyExist(_subkey))
     707             {
     708                 CreateSubKey(_subkey);
     709             }
     710 
     711             ///以可写方式打开注册表项
     712             RegistryKey key = OpenSubKey(true);
     713 
     714             ///如果注册表项打开失败,则返回false
     715             if (key == null)
     716             {
     717                 return false;
     718             }
     719 
     720             try
     721             {
     722                 key.SetValue(name, content, GetRegValueKind(regValueKind));
     723                 result = true;
     724             }
     725             catch
     726             {
     727                 result = false;
     728             }
     729             finally
     730             {
     731                 ///关闭对注册表项的更改
     732                 key.Close();
     733             }
     734             return result;
     735         }
     736         #endregion
     737 
     738         #region 读取键值内容
     739         /// <summary>
     740         /// 读取键值内容(请先设置RegeditKey和SubKey属性)
     741         /// 1.如果RegeditKey为空、null或者RegeditKey指示的键值不存在,返回null
     742         /// 2.如果SubKey为空、null或者SubKey指示的注册表项不存在,返回null
     743         /// 3.反之,则返回键值内容
     744         /// </summary>
     745         /// <returns>返回键值内容</returns>
     746         public virtual object ReadRegeditKey()
     747         {
     748             ///键值内容结果
     749             object obj = null;
     750 
     751             ///判断是否设置键值属性
     752             if (_regeditkey == string.Empty || _regeditkey == null)
     753             {
     754                 return null;
     755             }
     756 
     757             ///判断键值是否存在
     758             if (IsRegeditKeyExist(_regeditkey))
     759             {
     760                 ///打开注册表项
     761                 RegistryKey key = OpenSubKey();
     762                 if (key != null)
     763                 {
     764                     obj = key.GetValue(_regeditkey);
     765                 }
     766                 ///关闭对注册表项的更改
     767                 key.Close();
     768             }
     769             return obj;
     770         }
     771 
     772         /// <summary>
     773         /// 读取键值内容(请先设置SubKey属性)
     774         /// 1.如果SubKey为空、null或者SubKey指示的注册表项不存在,返回null
     775         /// 2.反之,则返回键值内容
     776         /// </summary>
     777         /// <param name="name">键值名称</param>
     778         /// <returns>返回键值内容</returns>
     779         public virtual object ReadRegeditKey(string name)
     780         {
     781             ///键值内容结果
     782             object obj = null;
     783 
     784             ///判断是否设置键值属性
     785             if (name == string.Empty || name == null)
     786             {
     787                 return null;
     788             }
     789 
     790             ///判断键值是否存在
     791             if (IsRegeditKeyExist(name))
     792             {
     793                 ///打开注册表项
     794                 RegistryKey key = OpenSubKey();
     795                 if (key != null)
     796                 {
     797                     obj = key.GetValue(name);
     798                 }
     799                 ///关闭对注册表项的更改
     800                 key.Close();
     801             }
     802             return obj;
     803         }
     804 
     805         /// <summary>
     806         /// 读取键值内容
     807         /// </summary>
     808         /// <param name="name">键值名称</param>
     809         /// <param name="subKey">注册表项名称</param>
     810         /// <returns>返回键值内容</returns>
     811         public virtual object ReadRegeditKey(string name, string subKey)
     812         {
     813             ///键值内容结果
     814             object obj = null;
     815 
     816             ///判断是否设置键值属性
     817             if (name == string.Empty || name == null)
     818             {
     819                 return null;
     820             }
     821 
     822             ///判断键值是否存在
     823             if (IsRegeditKeyExist(name))
     824             {
     825                 ///打开注册表项
     826                 RegistryKey key = OpenSubKey(subKey);
     827                 if (key != null)
     828                 {
     829                     obj = key.GetValue(name);
     830                 }
     831                 ///关闭对注册表项的更改
     832                 key.Close();
     833             }
     834             return obj;
     835         }
     836 
     837         /// <summary>
     838         /// 读取键值内容
     839         /// </summary>
     840         /// <param name="name">键值名称</param>
     841         /// <param name="subKey">注册表项名称</param>
     842         /// <param name="regDomain">注册表基项域</param>
     843         /// <returns>返回键值内容</returns>
     844         public virtual object ReadRegeditKey(string name, string subKey, RegDomain regDomain)
     845         {
     846             ///键值内容结果
     847             object obj = null;
     848 
     849             ///判断是否设置键值属性
     850             if (name == string.Empty || name == null)
     851             {
     852                 return null;
     853             }
     854 
     855             ///判断键值是否存在
     856             if (IsRegeditKeyExist(name))
     857             {
     858                 ///打开注册表项
     859                 RegistryKey key = OpenSubKey(subKey, regDomain);
     860                 if (key != null)
     861                 {
     862                     obj = key.GetValue(name);
     863                 }
     864                 ///关闭对注册表项的更改
     865                 key.Close();
     866             }
     867             return obj;
     868         }
     869         #endregion
     870 
     871         #region 删除键值
     872         /// <summary>
     873         /// 删除键值(请先设置RegeditKey和SubKey属性)
     874         /// 1.如果RegeditKey为空、null或者RegeditKey指示的键值不存在,返回false
     875         /// 2.如果SubKey为空、null或者SubKey指示的注册表项不存在,返回false
     876         /// </summary>
     877         /// <returns>如果删除成功,返回true,否则返回false</returns>
     878         public virtual bool DeleteRegeditKey()
     879         {
     880             ///删除结果
     881             bool result = false;
     882 
     883             ///判断是否设置键值属性,如果没有设置,则返回false
     884             if (_regeditkey == string.Empty || _regeditkey == null)
     885             {
     886                 return false;
     887             }
     888 
     889             ///判断键值是否存在
     890             if (IsRegeditKeyExist(_regeditkey))
     891             {
     892                 ///以可写方式打开注册表项
     893                 RegistryKey key = OpenSubKey(true);
     894                 if (key != null)
     895                 {
     896                     try
     897                     {
     898                         ///删除键值
     899                         key.DeleteValue(_regeditkey);
     900                         result = true;
     901                     }
     902                     catch
     903                     {
     904                         result = false;
     905                     }
     906                     finally
     907                     {
     908                         ///关闭对注册表项的更改
     909                         key.Close();
     910                     }
     911                 }
     912             }
     913 
     914             return result;
     915         }
     916 
     917         /// <summary>
     918         /// 删除键值(请先设置SubKey属性)
     919         /// 如果SubKey为空、null或者SubKey指示的注册表项不存在,返回false
     920         /// </summary>
     921         /// <param name="name">键值名称</param>
     922         /// <returns>如果删除成功,返回true,否则返回false</returns>
     923         public virtual bool DeleteRegeditKey(string name)
     924         {
     925             ///删除结果
     926             bool result = false;
     927 
     928             ///判断键值名称是否为空,如果为空,则返回false
     929             if (name == string.Empty || name == null)
     930             {
     931                 return false;
     932             }
     933 
     934             ///判断键值是否存在
     935             if (IsRegeditKeyExist(name))
     936             {
     937                 ///以可写方式打开注册表项
     938                 RegistryKey key = OpenSubKey(true);
     939                 if (key != null)
     940                 {
     941                     try
     942                     {
     943                         ///删除键值
     944                         key.DeleteValue(name);
     945                         result = true;
     946                     }
     947                     catch
     948                     {
     949                         result = false;
     950                     }
     951                     finally
     952                     {
     953                         ///关闭对注册表项的更改
     954                         key.Close();
     955                     }
     956                 }
     957             }
     958 
     959             return result;
     960         }
     961 
     962         /// <summary>
     963         /// 删除键值
     964         /// </summary>
     965         /// <param name="name">键值名称</param>
     966         /// <param name="subKey">注册表项名称</param>
     967         /// <returns>如果删除成功,返回true,否则返回false</returns>
     968         public virtual bool DeleteRegeditKey(string name, string subKey)
     969         {
     970             ///删除结果
     971             bool result = false;
     972 
     973             ///判断键值名称和注册表项名称是否为空,如果为空,则返回false
     974             if (name == string.Empty || name == null || subKey == string.Empty || subKey == null)
     975             {
     976                 return false;
     977             }
     978 
     979             ///判断键值是否存在
     980             if (IsRegeditKeyExist(name))
     981             {
     982                 ///以可写方式打开注册表项
     983                 RegistryKey key = OpenSubKey(subKey, true);
     984                 if (key != null)
     985                 {
     986                     try
     987                     {
     988                         ///删除键值
     989                         key.DeleteValue(name);
     990                         result = true;
     991                     }
     992                     catch
     993                     {
     994                         result = false;
     995                     }
     996                     finally
     997                     {
     998                         ///关闭对注册表项的更改
     999                         key.Close();
    1000                     }
    1001                 }
    1002             }
    1003 
    1004             return result;
    1005         }
    1006 
    1007         /// <summary>
    1008         /// 删除键值
    1009         /// </summary>
    1010         /// <param name="name">键值名称</param>
    1011         /// <param name="subKey">注册表项名称</param>
    1012         /// <param name="regDomain">注册表基项域</param>
    1013         /// <returns>如果删除成功,返回true,否则返回false</returns>
    1014         public virtual bool DeleteRegeditKey(string name, string subKey, RegDomain regDomain)
    1015         {
    1016             ///删除结果
    1017             bool result = false;
    1018 
    1019             ///判断键值名称和注册表项名称是否为空,如果为空,则返回false
    1020             if (name == string.Empty || name == null || subKey == string.Empty || subKey == null)
    1021             {
    1022                 return false;
    1023             }
    1024 
    1025             ///判断键值是否存在
    1026             if (IsRegeditKeyExist(name))
    1027             {
    1028                 ///以可写方式打开注册表项
    1029                 RegistryKey key = OpenSubKey(subKey, regDomain, true);
    1030                 if (key != null)
    1031                 {
    1032                     try
    1033                     {
    1034                         ///删除键值
    1035                         key.DeleteValue(name);
    1036                         result = true;
    1037                     }
    1038                     catch
    1039                     {
    1040                         result = false;
    1041                     }
    1042                     finally
    1043                     {
    1044                         ///关闭对注册表项的更改
    1045                         key.Close();
    1046                     }
    1047                 }
    1048             }
    1049 
    1050             return result;
    1051         }
    1052         #endregion
    1053         #endregion
    1054 
    1055         #region 受保护方法
    1056         /// <summary>
    1057         /// 获取注册表基项域对应顶级节点
    1058         /// 例子:如regDomain是ClassesRoot,则返回Registry.ClassesRoot
    1059         /// </summary>
    1060         /// <param name="regDomain">注册表基项域</param>
    1061         /// <returns>注册表基项域对应顶级节点</returns>
    1062         protected RegistryKey GetRegDomain(RegDomain regDomain)
    1063         {
    1064             ///创建基于注册表基项的节点
    1065             RegistryKey key;
    1066 
    1067             #region 判断注册表基项域
    1068             switch (regDomain)
    1069             {
    1070                 case RegDomain.ClassesRoot:
    1071                     key = Registry.ClassesRoot; break;
    1072                 case RegDomain.CurrentUser:
    1073                     key = Registry.CurrentUser; break;
    1074                 case RegDomain.LocalMachine:
    1075                     key = Registry.LocalMachine; break;
    1076                 case RegDomain.User:
    1077                     key = Registry.Users; break;
    1078                 case RegDomain.CurrentConfig:
    1079                     key = Registry.CurrentConfig; break;
    1080                 case RegDomain.DynDa:
    1081                     key = Registry.DynData; break;
    1082                 case RegDomain.PerformanceData:
    1083                     key = Registry.PerformanceData; break;
    1084                 default:
    1085                     key = Registry.LocalMachine; break;
    1086             }
    1087             #endregion
    1088 
    1089             return key;
    1090         }
    1091 
    1092         /// <summary>
    1093         /// 获取在注册表中对应的值数据类型
    1094         /// 例子:如regValueKind是DWord,则返回RegistryValueKind.DWord
    1095         /// </summary>
    1096         /// <param name="regValueKind">注册表数据类型</param>
    1097         /// <returns>注册表中对应的数据类型</returns>
    1098         protected RegistryValueKind GetRegValueKind(RegValueKind regValueKind)
    1099         {
    1100             RegistryValueKind regValueK;
    1101 
    1102             #region 判断注册表数据类型
    1103             switch (regValueKind)
    1104             {
    1105                 case RegValueKind.Unknown:
    1106                     regValueK = RegistryValueKind.Unknown; break;
    1107                 case RegValueKind.String:
    1108                     regValueK = RegistryValueKind.String; break;
    1109                 case RegValueKind.ExpandString:
    1110                     regValueK = RegistryValueKind.ExpandString; break;
    1111                 case RegValueKind.Binary:
    1112                     regValueK = RegistryValueKind.Binary; break;
    1113                 case RegValueKind.DWord:
    1114                     regValueK = RegistryValueKind.DWord; break;
    1115                 case RegValueKind.MultiString:
    1116                     regValueK = RegistryValueKind.MultiString; break;
    1117                 case RegValueKind.QWord:
    1118                     regValueK = RegistryValueKind.QWord; break;
    1119                 default:
    1120                     regValueK = RegistryValueKind.String; break;
    1121             }
    1122             #endregion
    1123             return regValueK;
    1124         }
    1125 
    1126         #region 打开注册表项
    1127         /// <summary>
    1128         /// 打开注册表项节点,以只读方式检索子项
    1129         /// 虚方法,子类可进行重写
    1130         /// </summary>
    1131         /// <returns>如果SubKey为空、null或者SubKey指示注册表项不存在,则返回null,否则返回注册表节点</returns>
    1132         protected virtual RegistryKey OpenSubKey()
    1133         {
    1134             ///判断注册表项名称是否为空
    1135             if (_subkey == string.Empty || _subkey == null)
    1136             {
    1137                 return null;
    1138             }
    1139 
    1140             ///创建基于注册表基项的节点
    1141             RegistryKey key = GetRegDomain(_domain);
    1142 
    1143             ///要打开的注册表项的节点
    1144             RegistryKey sKey = null;
    1145             ///打开注册表项
    1146             sKey = key.OpenSubKey(_subkey);
    1147             ///关闭对注册表项的更改
    1148             key.Close();
    1149             ///返回注册表节点
    1150             return sKey;
    1151         }
    1152 
    1153         /// <summary>
    1154         /// 打开注册表项节点
    1155         /// 虚方法,子类可进行重写
    1156         /// </summary>
    1157         /// <param name="writable">如果需要项的写访问权限,则设置为 true</param>
    1158         /// <returns>如果SubKey为空、null或者SubKey指示注册表项不存在,则返回null,否则返回注册表节点</returns>
    1159         protected virtual RegistryKey OpenSubKey(bool writable)
    1160         {
    1161             ///判断注册表项名称是否为空
    1162             if (_subkey == string.Empty || _subkey == null)
    1163             {
    1164                 return null;
    1165             }
    1166 
    1167             ///创建基于注册表基项的节点
    1168             RegistryKey key = GetRegDomain(_domain);
    1169 
    1170             ///要打开的注册表项的节点
    1171             RegistryKey sKey = null;
    1172             ///打开注册表项
    1173             sKey = key.OpenSubKey(_subkey, writable);
    1174             ///关闭对注册表项的更改
    1175             key.Close();
    1176             ///返回注册表节点
    1177             return sKey;
    1178         }
    1179 
    1180         /// <summary>
    1181         /// 打开注册表项节点,以只读方式检索子项
    1182         /// 虚方法,子类可进行重写
    1183         /// </summary>
    1184         /// <param name="subKey">注册表项名称</param>
    1185         /// <returns>如果SubKey为空、null或者SubKey指示注册表项不存在,则返回null,否则返回注册表节点</returns>
    1186         protected virtual RegistryKey OpenSubKey(string subKey)
    1187         {
    1188             ///判断注册表项名称是否为空
    1189             if (subKey == string.Empty || subKey == null)
    1190             {
    1191                 return null;
    1192             }
    1193 
    1194             ///创建基于注册表基项的节点
    1195             RegistryKey key = GetRegDomain(_domain);
    1196 
    1197             ///要打开的注册表项的节点
    1198             RegistryKey sKey = null;
    1199             ///打开注册表项
    1200             sKey = key.OpenSubKey(subKey);
    1201             ///关闭对注册表项的更改
    1202             key.Close();
    1203             ///返回注册表节点
    1204             return sKey;
    1205         }
    1206 
    1207         /// <summary>
    1208         /// 打开注册表项节点,以只读方式检索子项
    1209         /// 虚方法,子类可进行重写
    1210         /// </summary>
    1211         /// <param name="subKey">注册表项名称</param>
    1212         /// <param name="writable">如果需要项的写访问权限,则设置为 true</param>
    1213         /// <returns>如果SubKey为空、null或者SubKey指示注册表项不存在,则返回null,否则返回注册表节点</returns>
    1214         protected virtual RegistryKey OpenSubKey(string subKey, bool writable)
    1215         {
    1216             ///判断注册表项名称是否为空
    1217             if (subKey == string.Empty || subKey == null)
    1218             {
    1219                 return null;
    1220             }
    1221 
    1222             ///创建基于注册表基项的节点
    1223             RegistryKey key = GetRegDomain(_domain);
    1224 
    1225             ///要打开的注册表项的节点
    1226             RegistryKey sKey = null;
    1227             ///打开注册表项
    1228             sKey = key.OpenSubKey(subKey, writable);
    1229             ///关闭对注册表项的更改
    1230             key.Close();
    1231             ///返回注册表节点
    1232             return sKey;
    1233         }
    1234 
    1235         /// <summary>
    1236         /// 打开注册表项节点,以只读方式检索子项
    1237         /// 虚方法,子类可进行重写
    1238         /// </summary>
    1239         /// <param name="subKey">注册表项名称</param>
    1240         /// <param name="regDomain">注册表基项域</param>
    1241         /// <returns>如果SubKey为空、null或者SubKey指示注册表项不存在,则返回null,否则返回注册表节点</returns>
    1242         protected virtual RegistryKey OpenSubKey(string subKey, RegDomain regDomain)
    1243         {
    1244             ///判断注册表项名称是否为空
    1245             if (subKey == string.Empty || subKey == null)
    1246             {
    1247                 return null;
    1248             }
    1249 
    1250             ///创建基于注册表基项的节点
    1251             RegistryKey key = GetRegDomain(regDomain);
    1252 
    1253             ///要打开的注册表项的节点
    1254             RegistryKey sKey = null;
    1255             ///打开注册表项
    1256             sKey = key.OpenSubKey(subKey);
    1257             ///关闭对注册表项的更改
    1258             key.Close();
    1259             ///返回注册表节点
    1260             return sKey;
    1261         }
    1262 
    1263         /// <summary>
    1264         /// 打开注册表项节点
    1265         /// 虚方法,子类可进行重写
    1266         /// </summary>
    1267         /// <param name="subKey">注册表项名称</param>
    1268         /// <param name="regDomain">注册表基项域</param>
    1269         /// <param name="writable">如果需要项的写访问权限,则设置为 true</param>
    1270         /// <returns>如果SubKey为空、null或者SubKey指示注册表项不存在,则返回null,否则返回注册表节点</returns>
    1271         protected virtual RegistryKey OpenSubKey(string subKey, RegDomain regDomain, bool writable)
    1272         {
    1273             ///判断注册表项名称是否为空
    1274             if (subKey == string.Empty || subKey == null)
    1275             {
    1276                 return null;
    1277             }
    1278 
    1279             ///创建基于注册表基项的节点
    1280             RegistryKey key = GetRegDomain(regDomain);
    1281 
    1282             ///要打开的注册表项的节点
    1283             RegistryKey sKey = null;
    1284             ///打开注册表项
    1285             sKey = key.OpenSubKey(subKey, writable);
    1286             ///关闭对注册表项的更改
    1287             key.Close();
    1288             ///返回注册表节点
    1289             return sKey;
    1290         }
    1291         #endregion
    1292         #endregion
    1293     }
    
    
  • 相关阅读:
    jquery json简单例子
    使用面向对象的技术创建高级 Web 应用程序 文章来源:http://msdn.microsoft.com/zhcn/magazine/cc163419.aspx本文讨论:
    asp.net C# 下母版页使用
    SQL2005附加数据库"失败........无法更新数据库"xxx",因为数据库是只读
    转载 37个Ajax和CSS实现的Tab选项卡切换效果界面
    php substr,iconv_substr,mb_substr
    PHP的$_SERVER['HTTP_HOST']获取服务器地址功能详解,$_SERVER['HTTP_X_FORWARDED_HOST']
    js
    vue跨域处理(vue项目中baseUrl设置问题)
    从今天开始,争取每周都至少写一篇随笔
  • 原文地址:https://www.cnblogs.com/hfzsjz/p/1806563.html
Copyright © 2020-2023  润新知