zoukankan      html  css  js  c++  java
  • 【原创】C#注册表操作类(完整版)

    下面贴出自己用C#写的注册表操作类,欢迎大家拍砖!

     1.注册表基项静态域

     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   public enum 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 public enum 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 public class Register
    17 {
    18 #region 字段定义
    19 /// <summary>
    20 /// 注册表项名称
    21 /// </summary>
    22 private string _subkey;
    23 /// <summary>
    24 /// 注册表基项域
    25 /// </summary>
    26 private RegDomain _domain;
    27 /// <summary>
    28 /// 注册表键值
    29 /// </summary>
    30 private string _regeditkey;
    31 #endregion
    32
    33 #region 属性
    34 /// <summary>
    35 /// 设置注册表项名称
    36 /// </summary>
    37 public string 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 public string 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 public virtual void 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 public virtual void 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 public virtual void 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 public virtual void 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 /// 判断注册表项是否存在,默认是在注册表基项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 }
  • 相关阅读:
    SharePoint 创建 Lookup 类型的Site Column解决跨站问题
    Thinking In Design Pattern——MVP模式演绎
    SharePoint自动化部署,利用SPSD工具包
    SharePoint自动化部署,利用PowerShell 导出/导入AD中的用户
    64位内核第十四讲,获取系统滴答数与日期时间
    内核中通过进程PID获取进程的全部路径
    内核中根据进程Pid获取卷的全目录
    内核中PID_HANDLE_OBJECT等互相转换
    获取指定句柄的类型号.
    获取句柄的类型以及对应的ID序号
  • 原文地址:https://www.cnblogs.com/zwffff/p/1738417.html
Copyright © 2011-2022 走看看