用C#写系统相关的代码,一定会绕不开对系统注册表的操作,特别是设置系统一些功能选项,网吧、电竞酒店行业软件必备的一些功能,操作注册表也是必不可少的功能。C#如何操作注册表呢?一起来看看:
using Microsoft.Win32;
这个命名空间包含了注册表相关的类。Registry类、RegistryKey类。
1、Registry类封装了注册表的七个基本主键:
Registry.ClassesRoot 对应于HKEY_CLASSES_ROOT主键 Registry.CurrentUser 对应于HKEY_CURRENT_USER主键 Registry.LocalMachine 对应于 HKEY_LOCAL_MACHINE主键 Registry.User 应于 HKEY_USER主键 Registry.CurrentConfig 对应于HEKY_CURRENT_CONFIG主键 Registry.DynDa 对应于HKEY_DYN_DATA主键 Registry.PerformanceData 对应于HKEY_PERFORMANCE_DATA主键
2、RegistryKey类封装了对注册表的基本操作。包括读、写、删等操作的常用函数:
函数 | 说明 |
---|---|
Close | 关闭该项,如果该项的内容已修改,则将该项刷新到磁盘。 |
CreateSubKey(String) | 创建一个新子项或打开一个现有子项以进行写访问。 |
CreateSubKey(String, RegistryKeyPermissionCheck) | 使用指定的权限检查选项创建一个新子项或打开一个现有子项以进行写访问。 |
CreateSubKey(String, RegistryKeyPermissionCheck, RegistryOptions) | 使用指定的权限检查和注册表选项,创建或打开一个用于写访问的子项。 |
CreateSubKey(String, RegistryKeyPermissionCheck, RegistrySecurity) | 使用指定的权限检查选项和注册表安全性创建一个新子项或打开一个现有子项以进行写访问。 |
CreateSubKey(String, RegistryKeyPermissionCheck, RegistryOptions, RegistrySecurity) | 使用指定的权限检查选项、注册表选项和注册表安全性,创建或打开一个用于写访问的子项。 |
DeleteSubKey(String) | 删除指定的子项。 |
DeleteSubKey(String, Boolean) | 删除指定的子项,并指定在找不到该子项时是否引发异常。 |
DeleteSubKeyTree(String) | 递归删除子项和任何子级子项。 |
DeleteSubKeyTree(String, Boolean) | 以递归方式删除指定的子项和任何子级子项,并指定在找不到子项时是否引发异常。 |
DeleteValue(String) | 从此项中删除指定值。 |
DeleteValue(String, Boolean) | 从此项中删除指定的值,并指定在找不到该值时是否引发异常。 |
Dispose | 释放由 RegistryKey 类的当前实例占用的所有资源。 |
Flush | 将指定的打开注册表项的全部特性写到注册表中。 |
FromHandle(SafeRegistryHandle) | 根据指定的句柄创建注册表项。 |
FromHandle(SafeRegistryHandle, RegistryView) | 利用指定的句柄和注册表视图设置创建注册表项。 |
GetAccessControl() | 返回当前注册表项的访问控制安全性。 |
GetAccessControl(AccessControlSections) | 返回当前注册表项的访问控制安全性的指定部分。 |
GetSubKeyNames | 检索包含所有子项名称的字符串数组。 |
GetValue(String) | 检索与指定名称关联的值。 如果注册表中不存在名称/值对,则返回 null。 |
GetValue(String, Object) | 检索与指定名称关联的值。 如果未找到名称,则返回您提供的默认值。 |
GetValue(String, Object, RegistryValueOptions) | 检索与指定的名称和检索选项关联的值。 如果未找到名称,则返回您提供的默认值。 |
GetValueKind | 检索与指定名称关联的值的注册表数据类型。 |
GetValueNames | 检索包含与此项关联的所有值名称的字符串数组。 |
OpenBaseKey | 打开一个新的 RegistryKey,它使用指定的视图在本地计算机上表示请求的项。 |
OpenRemoteBaseKey(RegistryHive, String) | 打开一个新的 RegistryKey,它表示远程计算机上的请求的项。 |
OpenRemoteBaseKey(RegistryHive, String, RegistryView) | 打开一个新的注册表项,它使用指定的视图在远程计算机上表示请求的项。 |
OpenSubKey(String) | 以只读方式检索子项。 |
OpenSubKey(String, RegistryKeyPermissionCheck) | 检索指定的子项以进行读取或读/写访问。 |
OpenSubKey(String, Boolean) | 检索指定的子项,并指定是否将写访问权限应用于该项。 |
OpenSubKey(String, RegistryKeyPermissionCheck, RegistryRights) | 检索指定的子项以进行读取或读/写访问,请求指定的访问权限。 |
SetAccessControl | 向现有注册表项应用 Windows 访问控制安全性。 |
SetValue(String, Object) | 设置指定的名称/值对。 |
SetValue(String, Object, RegistryValueKind) | 使用指定的注册表数据类型设置注册表项中的名称/值对的值。 |
ToString 检索此项的字符串表示形式。 | (重写 Object.ToString()。) |
3、注册表中的“键值数据项”的类型
在注册表中,“键值项数据”可分为下面三种类型。
数据类型 | 说明 |
---|---|
REG_BINARY | 在注册表中,二进制是没有长度限制的,可以是任意个字节的长度。在注册表编辑器中,二进制数据以十六进制的方式显示出来 |
REG_DWORD | DWORD值是一个32位(4个字节,即双字)长度的数值。在注册表编辑器中,你将会发现系统以十六进制的方式显示DWORD值,在编辑DWORD数值时,可以选择用二进制、十进制或是十六进制的方式进行输入 |
REG_SZ |
在注册表中,字符串值一般用来表示文件的描述、硬件的标识等。通常它由字母和数字组成。 |
通过键值名、键值就可以组成一种键值项数据,这就相当于Win.ini、System.ini文件中小节下的设置行。其实,使用注册表编辑器将这些键值项数据导出后,其形式与.ini文件中的设置完全一样。
1、创建:
RegistryKey hklm = Registry.LocalMachine; RegistryKey hkSoftware = hklm.OpenSubKey(“Software”); RegistryKey hkMine = hkSoftware.CreateSubKey(“MyOwnSoftware”);2,打开
//使用OpenSubKey()打开项,获得RegistryKey对象,当路径不存在时,为Null。第二个参数为true,表示可写,可读,可删;省略时只能读。 RegistryKey hklm = Registry.LocalMachine; RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE\test",true); hklm.Close(); hkSoftWare.Close();
3,删除
//主要用到了DeleteSubKey(),删除test项 RegistryKey hklm = Registry.LocalMachine; hklm.DeleteSubKey(@"SOFTWARE\test", true); //为true时,删除的注册表不存在时抛出异常;当为false时不抛出异常。 hklm.Close();
1、创建:
//主要用到了SetValue(),表示在test下创建名称为Name,值为RegistryTest的键值。第三个参数表示键值类型,省略时,默认为字符串 RegistryKey hklm = Registry.LocalMachine; RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE\test",true); hkSoftWare.SetValue("Name", "RegistryTest", RegistryValueKind.String); hklm.Close(); hkSoftWare.Close();2、打开
//主要用到了GetValue(),获得名称为"Name"的键值 RegistryKey hklm = Registry.LocalMachine; RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE\test", true); string sValue = hkSoftWare.GetValue("Name").ToString(); hklm.Close(); hkSoftWare.Close();
3、删除
//主要用到了DeleteValue(),表示删除名称为"Name"的键值,第二个参数表示是否抛出异常 RegistryKey hklm = Registry.LocalMachine; RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE\test", true); hkSoftWare.DeleteValue("Name", true); hklm.Close(); hkSoftWare.Close();
//判断注册表项是否存在 private bool IsRegistryKeyExist(string sKeyName) { string[] sKeyNameColl; RegistryKey hklm = Registry.LocalMachine; RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE"); sKeyNameColl = hkSoftWare.GetSubKeyNames(); //获取SOFTWARE下所有的子项 foreach (string sName in sKeyNameColl) { if (sName == sKeyName) { hklm.Close(); hkSoftWare.Close(); return true; } } hklm.Close(); hkSoftWare.Close(); return false; } //判断键值是否存在 private bool IsRegistryValueNameExist(string sValueName) { string[] sValueNameColl; RegistryKey hklm = Registry.LocalMachine; RegistryKey hkTest = hklm.OpenSubKey(@"SOFTWARE\test"); sValueNameColl = hkTest.GetValueNames(); //获取test下所有键值的名称 foreach (string sName in sValueNameColl) { if (sName == sValueName) { hklm.Close(); hkTest.Close(); return true; } } hklm.Close(); hkTest.Close(); return false; }
//开启程序自启动 string path = Application.ExecutablePath; RegistryKey rk = Registry.LocalMachine; RegistryKey rk2 = rk.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run"); rk2.SetValue("JcShutdown", path); rk2.Close(); rk.Close(); //关闭程序自启动 string path = Application.ExecutablePath; RegistryKey rk = Registry.LocalMachine; RegistryKey rk2 = rk.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run"); rk2.DeleteValue("JcShutdown", false); rk2.Close(); rk.Close();