首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C#使用P/Invoke来实现注册表的增删改查功能

C#使用P/Invoke来实现注册表的增删改查功能

作者头像
Wesky
发布2024-08-13 19:13:56
发布2024-08-13 19:13:56
19200
代码可运行
举报
文章被收录于专栏:Dotnet DancerDotnet Dancer
运行总次数:0
代码可运行

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

当前注册表主目录:

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

该包采用mit开源,开源项目地址:

Gitee:https://gitee.com/dreamer_j/open-tools.git Github:https://github.com/LittleLittleRobot/OpenTools.git

操作演示:

创建注册表项

设置注册表值

读取注册表值

删除注册表值

删除注册表项

操作演示代码

代码语言:javascript
代码运行次数:0
运行
复制
IRegistryManager registryManager = new RegistryManager();

// 创建注册表项
// registryManager.CreateKey(RegistryRoot.CurrentUser, @"Wesky\MyApp");

// 设置注册表值
// registryManager.SetValue(RegistryRoot.CurrentUser, @"Wesky\MyApp", "MyValue", "Hello, Registry!");

// 读取注册表值
// var value = registryManager.GetValue(RegistryRoot.CurrentUser, @"Wesky\MyApp", "MyValue");
// Console.WriteLine($"读取到的注册表值:{value}");

// 删除注册表值
// registryManager.DeleteValue(RegistryRoot.CurrentUser, @"Wesky\MyApp", "MyValue");

// 删除注册表项
registryManager.DeleteKey(RegistryRoot.CurrentUser, @"Wesky\MyApp");
Console.WriteLine("Over");
Console.ReadKey();

核心包内源码:

代码语言:javascript
代码运行次数:0
运行
复制
 [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);
    }



如果觉得有用或帮助,欢迎转发,点赞或在看。不介意也可以关注个人公众号:Dotnet Dancer

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Dotnet Dancer 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档