Register.cs 45 KB

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