1.注册表基项静态域

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

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

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

3.注册表操作类

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

C#注册表读写完整操作类的更多相关文章

  1. QSettings提供了非常方便的注册表读写

    Qt的QSettings提供了非常方便的注册表读写 写入: //写入注册表 void setRegValue( QString strPath, QString strItemName, QStrin ...

  2. C#:文件/注册表/线程的操作

    文件的操作:(file与fileinfo,前者是静态方法,执行安全检查,适合对一个的操作) 1.1.create: using System; using System.Collections.Gen ...

  3. 百度地图LBS云平台读写数据操作类

    最近写了个叫<行踪记录仪>的手机软件,用了百度云来记录每个用户的最近位置,以便各用户能在地图上找到附近的人,为此写了个类来读写数据,大致如下: import java.util.Array ...

  4. QSettings配置读写-win注册表操作-ini文件读写

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSettings配置读写-win注册表操作-ini文件读写     本文地址:http:// ...

  5. 【读书笔记】C#高级编程 第二十四章 文件和注册表操作

    (一)文件和注册表 对于文件系统操作,相关的类几乎都在System.IO名称空间中,而注册表操作由System.Win32名称空间中的类来处理. (二)管理文件系统 System.MarshalByR ...

  6. delphi 注册表操作(读取、添加、删除、修改)完全手册

    DELPHI VS PASCAL(87)  32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息. 一.创建和释放TRegistry对象 1.创建TRegistry对象.为了操 ...

  7. C#操作注册表全攻略

    相信每个人对注册表并不陌生,在运行里面输入“regedit”就可以打开注册表编辑器了.这东西对Windows系统来说可是比较重要的,也是病 毒常常会光顾的地方,比如病毒和恶意软件常常会在注册表的启动项 ...

  8. Delphi的注册表操作

    转帖:Delphi的注册表操作 2009-12-21 11:12:52 分类: Delphi的注册表操作 32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息.     一.创 ...

  9. 【转载】 C#读写注册表

    文章地址:https://blog.csdn.net/younghaiqing/article/details/61918968 自Windows95以来的所有Windows版本中,注册表是包含Win ...

随机推荐

  1. jQuery学习笔记(Ajax)

    jQuery对Ajax操作进行了封装,在jQuery中$.ajax方法属于最底层的方法,第2层是$.load().$.get().$.post()方法,第3层是$.getScript()和$.getJ ...

  2. ios处理键盘

    #pragma mark - Keyboard - (void)addKeyboardNoti { [[NSNotificationCenter defaultCenter] addObserver: ...

  3. tmux用于恢复远程屏幕

    1.我主要用tmux在远程登陆后,恢复以前会话时候用. 2.tmux创建新会话: tmux new -s 会话名 3.返回控制台: Ctrl+b d ,Ctrl+b命令是tmux前置命令,每次都要先输 ...

  4. linux下工具exfs用法

    背景:买了一块新的ssd硬盘,挂载到ubuntu下. 1.快速格式化: 1)查看ssd硬盘的盘符: sudo fdisk -l 2)快速格式化: sudo mkfs.ext4 -T default / ...

  5. FLINK 设计文档

    https://cwiki.apache.org/confluence/display/FLINK/Apache+Flink+Home https://cwiki.apache.org/conflue ...

  6. Eclipse 配置Maven以及修改默认Repository

    今天将Eclipse关于Maven的配置总结一下,方便以后配置. 一.配置Maven环境 1.下载apache-maven文件,选择自己需要的版本,地址:http://mirrors.cnnic.cn ...

  7. debian8.5安装sublime text3

    在官网www.sublimetext.com下载安装包 我这里用的是Ubuntu 64 bit版. 下载后使用su命令切换到root账户. 执行安装命令 dpkg -i sublime-text*.d ...

  8. (原) ubuntu下用pycharm2016.1专业版配docker编译环境(docker Interpreter)

    一:先创建docker-machine 先创建docker machine.我主机上的虚拟机是virtualbox.$ docker-machine create --driver virtualbo ...

  9. Spark(Hive) SQL中UDF的使用(Python)【转】

    相对于使用MapReduce或者Spark Application的方式进行数据分析,使用Hive SQL或Spark SQL能为我们省去不少的代码工作量,而Hive SQL或Spark SQL本身内 ...

  10. 【C/C++】深入理解指针和数组的关系

    对数组名进行取地址运算 ,,}; ] = &a; //注意左值 对数组名取地址,得到的指针为指向整个数组的指针. 形参数组 形参为数组时勿须带数组长度,因为计算机不会处理,如果需要传数组长度, ...