.NET使用P/Invoke来实现注册表的增、删、改、查功能

注册表可以用来进行存储一些程序的信息,例如用户的权限、或者某些值等,可以根据个人需要进行存储和删减。

当前注册表主目录:

.NET使用P/Invoke来实现注册表的增、删、改、查功能

引用包 Wesky.Net.OpenTools 1.0.5或者以上版本

.NET使用P/Invoke来实现注册表的增、删、改、查功能

 操作演示:

创建注册表项

.NET使用P/Invoke来实现注册表的增、删、改、查功能

设置注册表值

.NET使用P/Invoke来实现注册表的增、删、改、查功能

读取注册表值

.NET使用P/Invoke来实现注册表的增、删、改、查功能

删除注册表值

.NET使用P/Invoke来实现注册表的增、删、改、查功能

删除注册表项

.NET使用P/Invoke来实现注册表的增、删、改、查功能

操作演示代码

IRegistryManager registryManager = new RegistryManager();  // 创建注册表项 // registryManager.CreateKey(RegistryRoot.CurrentUser, @"WeskyMyApp");  // 设置注册表值 // registryManager.SetValue(RegistryRoot.CurrentUser, @"WeskyMyApp", "MyValue", "Hello, Registry!");  // 读取注册表值 // var value = registryManager.GetValue(RegistryRoot.CurrentUser, @"WeskyMyApp", "MyValue"); // Console.WriteLine($"读取到的注册表值:{value}");  // 删除注册表值 // registryManager.DeleteValue(RegistryRoot.CurrentUser, @"WeskyMyApp", "MyValue");  // 删除注册表项 registryManager.DeleteKey(RegistryRoot.CurrentUser, @"WeskyMyApp"); Console.WriteLine("Over"); Console.ReadKey();

 

 

核心包内源码:

 [DllImport("advapi32.dll", CharSet = CharSet.Auto)]     private static extern int RegCreateKeyEx(         IntPtr hKey,         string lpSubKey,         int Reserved,         string lpClass,         int dwOptions,         int samDesired,         IntPtr lpSecurityAttributes,         out IntPtr phkResult,         out int lpdwDisposition);      [DllImport("advapi32.dll", CharSet = CharSet.Auto)]     private static extern int RegOpenKeyEx(         IntPtr hKey,         string lpSubKey,         int ulOptions,         int samDesired,         out IntPtr phkResult);      [DllImport("advapi32.dll", CharSet = CharSet.Auto)]     private static extern int RegCloseKey(IntPtr hKey);      [DllImport("advapi32.dll", CharSet = CharSet.Auto)]     private static extern int RegSetValueEx(         IntPtr hKey,         string lpValueName,         int Reserved,         int dwType,         byte[] lpData,         int cbData);      [DllImport("advapi32.dll", CharSet = CharSet.Auto)]     private static extern int RegGetValue(         IntPtr hKey,         string lpSubKey,         string lpValue,         int dwFlags,         out int pdwType,         StringBuilder pvData,         ref int pcbData);      [DllImport("advapi32.dll", CharSet = CharSet.Auto)]     private static extern int RegDeleteKey(IntPtr hKey, string lpSubKey);      [DllImport("advapi32.dll", CharSet = CharSet.Auto)]     private static extern int RegDeleteValue(IntPtr hKey, string lpValueName);      /// <summary>     /// 获取注册表根键     /// Get registry root key     /// </summary>     /// <param name="root"></param>     /// <returns></returns>     /// <exception cref="ArgumentOutOfRangeException"></exception>     private IntPtr GetRegistryRootKey(RegistryRoot root)     {         switch (root)         {             case RegistryRoot.ClassesRoot:                 return HKEY_CLASSES_ROOT;             case RegistryRoot.CurrentUser:                 return HKEY_CURRENT_USER;             case RegistryRoot.LocalMachine:                 return HKEY_LOCAL_MACHINE;             case RegistryRoot.Users:                 return HKEY_USERS;             case RegistryRoot.CurrentConfig:                 return HKEY_CURRENT_CONFIG;             default:                 throw new ArgumentOutOfRangeException(nameof(root), root, null);         }     }      /// <summary>     /// 创建注册表键     /// Create registry key     /// </summary>     /// <param name="root"></param>     /// <param name="subKey"></param>     /// <exception cref="Exception"></exception>     public void CreateKey(RegistryRoot root, string subKey)     {         IntPtr hKey = GetRegistryRootKey(root);         int result = RegCreateKeyEx(hKey, subKey, 0, null, REG_OPTION_NON_VOLATILE, KEY_WRITE, IntPtr.Zero, out IntPtr phkResult, out _);          if (result != ERROR_SUCCESS)         {             throw new Exception("创建注册表key失败。 Failed to create registry key.");         }          RegCloseKey(phkResult);     }      /// <summary>     /// 删除注册表键     /// Delete registry key     /// </summary>     /// <param name="root"></param>     /// <param name="subKey"></param>     /// <exception cref="Exception"></exception>     public void DeleteKey(RegistryRoot root, string subKey)     {         IntPtr hKey = GetRegistryRootKey(root);         int result = RegDeleteKey(hKey, subKey);          if (result != ERROR_SUCCESS)         {             throw new Exception("删除注册表key失败。Failed to delete registry key.");         }     }      /// <summary>     /// 设置注册表值     /// Set registry value     /// </summary>     /// <param name="root"></param>     /// <param name="subKey"></param>     /// <param name="valueName"></param>     /// <param name="value"></param>     /// <exception cref="Exception"></exception>     public void SetValue(RegistryRoot root, string subKey, string valueName, string value)     {         IntPtr hKey = GetRegistryRootKey(root);          int result = RegOpenKeyEx(hKey, subKey, 0, KEY_WRITE, out IntPtr phkResult);         if (result != ERROR_SUCCESS)         {             throw new Exception("打开注册表key失败。Failed to open registry key.");         }          byte[] data = Encoding.Unicode.GetBytes(value);         result = RegSetValueEx(phkResult, valueName, 0, REG_SZ, data, data.Length);          if (result != ERROR_SUCCESS)         {             throw new Exception("设置注册表值失败。Failed to set registry value.");         }          RegCloseKey(phkResult);     }      /// <summary>     /// 获取注册表值     /// Get registry value     /// </summary>     /// <param name="root"></param>     /// <param name="subKey"></param>     /// <param name="valueName"></param>     /// <returns></returns>     /// <exception cref="Exception"></exception>     public string GetValue(RegistryRoot root, string subKey, string valueName)     {         IntPtr hKey = GetRegistryRootKey(root);          int result = RegOpenKeyEx(hKey, subKey, 0, KEY_READ, out IntPtr phkResult);         if (result != ERROR_SUCCESS)         {             throw new Exception("打开注册表key失败。Failed to open registry key.");         }          int type = 0;         int size = 1024;         StringBuilder data = new StringBuilder(size);          result = RegGetValue(phkResult, null, valueName, RRF_RT_REG_SZ, out type, data, ref size);          if (result != ERROR_SUCCESS)         {             throw new Exception("获取注册表的值失败。Failed to get registry value.");         }          RegCloseKey(phkResult);          return data.ToString();     }      /// <summary>     /// 删除注册表值     /// Delete registry value     /// </summary>     /// <param name="root"></param>     /// <param name="subKey"></param>     /// <param name="valueName"></param>     /// <exception cref="Exception"></exception>     public void DeleteValue(RegistryRoot root, string subKey, string valueName)     {         IntPtr hKey = GetRegistryRootKey(root);          int result = RegOpenKeyEx(hKey, subKey, 0, KEY_WRITE, out IntPtr phkResult);         if (result != ERROR_SUCCESS)         {             throw new Exception("打开注册表key失败。Failed to open registry key.");         }          result = RegDeleteValue(phkResult, valueName);          if (result != ERROR_SUCCESS)         {             throw new Exception("删除注册表的值失败。Failed to delete registry value.");         }          RegCloseKey(phkResult);     }

 

 

 

发表评论

评论已关闭。

相关文章