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 }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值