WPF开发随笔收录-操作注册表

打印 上一主题 下一主题

主题 615|帖子 615|积分 1845

一、前言

在windows平台软件开发过程中,注册表的操作是经常会遇到的一个场景。今天记录一下在操作注册表时遇到的一些坑;
二、正文

1、操作注册表,于是直接从网上找了一段代码来用
  1. /// <summary>
  2. /// 读取注册表
  3. /// </summary>
  4. /// <param name="name"></param>
  5. /// <returns></returns>
  6. public static string GetRegistData(string name)
  7. {
  8.     string registData;
  9.     RegistryKey hklm = Registry.LocalMachine;
  10.     RegistryKey software = hklm.OpenSubKey("SOFTWARE", true);
  11.     RegistryKey aimdir = software.OpenSubKey("XXX", true);
  12.     registData = aimdir.GetValue(name).ToString();
  13.     return registData;
  14. }
  15. /// <summary>
  16. /// 写入注册表
  17. /// </summary>
  18. /// <param name="name"></param>
  19. /// <param name="tovalue"></param>
  20. public static void WriteRegedit(string name, string tovalue)
  21. {
  22.     RegistryKey hklm = Registry.LocalMachine;
  23.     RegistryKey software = hklm.OpenSubKey("SOFTWARE", true);
  24.     RegistryKey aimdir = software.CreateSubKey("XXX");
  25.     aimdir.SetValue(name, tovalue);
  26. }
  27. /// <summary>
  28. /// 删除注册表
  29. /// </summary>
  30. /// <param name="name"></param>
  31. public static void DeleteRegist(string name)
  32. {
  33.     string[] aimnames;
  34.     RegistryKey hklm = Registry.LocalMachine;
  35.     RegistryKey software = hklm.OpenSubKey("SOFTWARE", true);
  36.     RegistryKey aimdir = software.OpenSubKey("XXX", true);
  37.     aimnames = aimdir.GetSubKeyNames();
  38.     foreach (string aimKey in aimnames)
  39.     {
  40.         if (aimKey == name) aimdir.DeleteSubKeyTree(name);
  41.     }
  42. }
复制代码
2、但在使用过程中,发现通过这种方式写的注册表值虽然能读取出来,但是在电脑上打开注册表工具,却无法查看到对应自己写入的注册表值,翻阅资料后发现这样写有问题,还需要判断一下电脑是32位的还是64位的,需要做一下修改;参考下面修改后的代码,先查出电脑对应的位数,再去操作对应指定位数的注册表;
  1. /// <summary>
  2. /// 读取注册表
  3. /// </summary>
  4. /// <param name="name"></param>
  5. /// <returns></returns>
  6. public static string GetRegistData(string name)
  7. {
  8.     string registData;
  9.     RegistryView useRegistryView = Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32;
  10.     RegistryKey hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, useRegistryView);
  11.     RegistryKey software = hklm.OpenSubKey("SOFTWARE", true);
  12.     RegistryKey aimdir = software.OpenSubKey("XXX", true);
  13.     registData = aimdir.GetValue(name).ToString();
  14.     return registData;
  15. }
  16. /// <summary>
  17. /// 写入注册表
  18. /// </summary>
  19. /// <param name="name"></param>
  20. /// <param name="tovalue"></param>
  21. public static void WriteRegedit(string name, string tovalue)
  22. {
  23.     RegistryView useRegistryView = Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32;
  24.     RegistryKey hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, useRegistryView);
  25.     RegistryKey software = hklm.OpenSubKey("SOFTWARE", true);
  26.     RegistryKey aimdir = software.CreateSubKey("XXX");
  27.     aimdir.SetValue(name, tovalue);
  28. }
  29. /// <summary>
  30. /// 删除注册表
  31. /// </summary>
  32. /// <param name="name"></param>
  33. public static void DeleteRegist(string name)
  34. {
  35.     string[] aimnames;
  36.     RegistryView useRegistryView = Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32;
  37.     RegistryKey hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, useRegistryView);
  38.     RegistryKey software = hklm.OpenSubKey("SOFTWARE", true);
  39.     RegistryKey aimdir = software.OpenSubKey("XXX", true);
  40.     aimnames = aimdir.GetSubKeyNames();
  41.     foreach (string aimKey in aimnames)
  42.     {
  43.         if (aimKey == name) aimdir.DeleteSubKeyTree(name);
  44.     }
  45. }
复制代码
3、由于注册表的操作涉及到管理员权限,所以上面的几个方法里最好加上try,防止程序出现异常奔溃;

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表