此片基于VS2015写的,别的有出入请指正。
最近在用C#写win窗体发现注册表写起来好麻烦的说。
最简单的问题就是win7上面的32位和64位的注册表写入的地方不是同一个。
网上很多的例子给出来都是12年或更早之前的,那应该都是VS08左右的想法了吧。所以不知道到底怎么弄,后来索性做了两个东西一个32位一个64位。
下面把具体的现象说一下:
①:本机模式 64 位程序运行在纯模式下,并且访问键和存储在以下注册表子键中的值:HKEY_LOCAL_MACHINE\Software
②:32 位程序运行在 WOW64 模式下,并且访问键和值存储在以下注册表子项中:HKEY_LOCAL_MACHINE\Software\WOW6432nod
也就是说打包出来32位的程序跟打包出来的64位程序如果用同样的代码写。32位会默认在原路径上转入WOW6432nod文件夹中这样一来会对读取,删除或改动有很大的影响。
- 64位窗体上面注册表操作的工具方法如下:
//代码开始
using System;
using Microsoft.Win32;
using System.Windows.Forms;
namespace WindowsFormsApplication1.Controller
{
class RegistryKeyController
{
//创建横竖文件夹
public void createHengshu()
{
if (Environment.Is64BitOperatingSystem == true)
{
RegistryKey LMInfo = Registry.LocalMachine;
RegistryKey software = LMInfo.OpenSubKey("SOFTWARE", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl);
software.CreateSubKey("hengshu");
}
else
{
MessageBox.Show("该电脑为32位版本请安装32位版本");
}
}
//判断是否有横竖文件夹
public bool existHengshu()
{
bool _existHenshu = false;
try
{
if (Environment.Is64BitOperatingSystem == true)
{
string[] subkeyNames;
RegistryKey LMInfo = Registry.LocalMachine;
RegistryKey software = LMInfo.OpenSubKey("SOFTWARE", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl);
subkeyNames = software.GetSubKeyNames();
foreach (string keyName in subkeyNames)
{
if (keyName == "hengshu")
{
_existHenshu = true;
return _existHenshu;
}
}
}
else
{
MessageBox.Show("该电脑为32位版本请安装32位版本");
}
}
catch
{ }
return _existHenshu;
}
//读取指定名称的注册表的值
public string GetRegistData(string name)
{
if (Environment.Is64BitOperatingSystem == true)
{
string registData;
RegistryKey LMInfo = Registry.LocalMachine;
RegistryKey software = LMInfo.OpenSubKey("SOFTWARE", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl); //以上是读取的注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下的XXX目录中名称为name的注册表值;
RegistryKey myName = software.OpenSubKey("hengshu", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl);
registData = myName.GetValue(name).ToString();
return registData;
}
else
{
MessageBox.Show("该电脑为32位版本请安装32位版本");
return null;
}
}
//向注册表里写东西
public void WTRegedit(string name, string tovalue)
{
if (Environment.Is64BitOperatingSystem == true)
{
RegistryKey LMInfo = Registry.LocalMachine;
RegistryKey software = LMInfo.OpenSubKey("SOFTWARE", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl);
RegistryKey myName = software.CreateSubKey("hengshu", RegistryKeyPermissionCheck.ReadWriteSubTree);
myName.SetValue(name, tovalue);
}
else
{
MessageBox.Show("该电脑为32位版本请安装32位版本");
}
}
//删除注册表里hengshu文件夹中的指定字段
public void DeleteRegist(string name)
{
try
{
if (Environment.Is64BitOperatingSystem == true)
{
string[] myNames;
RegistryKey LMInfo = Registry.LocalMachine;
RegistryKey software = LMInfo.OpenSubKey("SOFTWARE", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl);
RegistryKey myName = software.OpenSubKey("hengshu", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl);
//这里是删除指定字段的方法,因为注册表涉及到开关机,还有诸多后台操作,不能瞎比删
myNames = myName.GetValueNames();
foreach (string keyName in myNames)
{
if (keyName == name)
{//只有deleteValue才会删除指定字段,其他是删除文件夹没有任何作用
myName.DeleteValue(name);//是在注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下XXX目录中删除名称为name注册表项;
}
}
}
else
{
MessageBox.Show("该电脑为32位版本请安装32位版本");
}
}
catch { }
}
//判断指定注册表是否存在
public bool IsRegeditExist(string name)
{
bool _exist = false;
try
{
if (Environment.Is64BitOperatingSystem == true)
{
string[] subkeyNames;
RegistryKey LMInfo = Registry.LocalMachine;
RegistryKey software = LMInfo.OpenSubKey("SOFTWARE", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl);
RegistryKey myName = software.OpenSubKey("hengshu", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl);
subkeyNames = myName.GetValueNames();
foreach (string keyName in subkeyNames)
{
if (keyName == name)
{
_exist = true;
return _exist;
}
}
}
else
{
MessageBox.Show("该电脑为32位版本请安装32位版本");
}
}
catch
{ }
return _exist;//HKEY_LOCAL_MACHINE\SOFTWARE目录下XXX目录中判断名称为name注册表项是否存在,这一方法在删除注册表时已经存在,在新建一注册表项时也应有相应判断;
}
}
}
- 这边是提供一个封装好的工具,如下是怎么使用,我的例子是把我输入的IP,Port,Name写到注册表里面,并且能够查询,删除,添加
using WindowsFormsApplication1.Class;
namespace WindowsFormsApplication1.Controller
{
class RegistryToolController
{
RegistryKeyController Hengshu = new RegistryKeyController();
//判断是否为64位
//各类信息到注册表
public void RegistInfo(string ip_out, string port_out, string name_out)
{
Hengshu.WTRegedit("ip", ip_out);
Hengshu.WTRegedit("port", port_out);
Hengshu.WTRegedit("name", name_out);
}
//得到注册表信息
public RegisterInfoClass getRegistInfo()
{
RegisterInfoClass Info = new RegisterInfoClass();
Info.ip = Hengshu.GetRegistData("ip");
Info.port = Hengshu.GetRegistData("port");
Info.name = Hengshu.GetRegistData("name");
return Info;
}
//判断是否存在注册信息
public bool ExistRegistInfo()
{
//存在hengshu文件夹,且存在ip,port,name
if (Hengshu.IsRegeditExist("ip") && Hengshu.IsRegeditExist("port") && Hengshu.IsRegeditExist("name"))
{
return true;
}
else
{
return false;
}
}
///
///注销注册信息
///
public void DeleteRegistInfo()
{
Hengshu.DeleteRegist("ip");
Hengshu.DeleteRegist("port");
Hengshu.DeleteRegist("name");
}
}
}
- 值得一提的是:
可能有些看不懂我再给一张图
就是说用deleteValue方法才能删除写入的ip,name,port字段
你若是想删除某个注册表下的文件夹就可以用deleteSubkey
这个其实也是Value跟Subkey的区别。