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

当前注册表主目录:

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

操作演示:

创建注册表项

设置注册表值

读取注册表值

删除注册表值

删除注册表项

操作演示代码

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();

核心包内源码:

 [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);
}
 

.NET使用P/Invoke来实现注册表的增、删、改、查功能的更多相关文章

  1. django单表操作 增 删 改 查

    一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取出数据. 目的:通过classes(班 ...

  2. Django(十)模型:django模型类对数据库的:增/删/改/查、自关联、管理器、元选项(指定表名)

    一.插入.更新和删除 调用一个模型类对象的save方法的时候就可以实现对模型类对应数据表的插入和更新. 调用一个模型类对象的delete方法的时候就可以实现对模型类对应数据表数据的删除. 二.自关联 ...

  3. oracle 11g 建库 建表 增 删 改 查 约束

    一.建库 1.(点击左上角带绿色+号的按钮) 2.(进入这个界面,passowrd为密码.填写完后点击下面一排的Test按钮进行测试,无异常就点击Connect) 二.建表 1-1. create t ...

  4. 第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据

    第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据 ADO.NET 为什么要学习? 我们要搭建一个平台(Web/Winform ...

  5. MySql——进阶一(库表的建 删 改)

    基于学生管理系统建立 数据库 和 表 表的样式: 表(一)Student (学生use) 属性名 数据类型 可否为空 含 义 Sno varchar (20) 否 学号(主码) Sname varch ...

  6. 注册表 锁IE首页

    用附件中的修改软件,或者用以下修改注册表的办法.   一.注册表被修改的原因及解决办法 其实,该恶意网页是含有有害代码的ActiveX网页文件,这些广告信息的出现是因为浏览者的注册表被恶意更改的结果. ...

  7. 学习window系统下的注册表

    一直不明白注册表是一个什么鬼,查了资料后大概明白了注册表到底有什么用,其实简单来说注册表就是一个存放系统.硬件.应用配置信息的数据ku.##### 一.注册表的来历在最早的视窗操作系统win3.x中, ...

  8. S3c2440A WINCE平台HIVE注册表+binfs的实现

    今天最大的收获莫过于把binfs和hive注册表同时在三星的平台上实现了,这可是前无古人啊(只是看到好多哥们说找不到三星的HIVE资料),哈哈哈.怕今天的成果日后成炮灰,还是写下来比较好,要养成这样的 ...

  9. 10#Windows注册表的那些事儿

    引言 用了多年的Windows系统,其实并没有对Windows系统进行过深入的了解,也正是由于Windows系统不用深入了解就可以简单上手所以才有这么多人去使用.笔者是做软件开发的,使用的基本都是Wi ...

  10. maya2012卸载/安装失败/如何彻底卸载清除干净maya2012注册表和文件的方法

    maya2012提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装maya2012失败提示maya2012安装未完成,某些产品无法安装,也有时候想重新安装maya ...

随机推荐

  1. OpenHarmony 3.1 Release版本关键特性解析——HDI硬件设备接口介绍

    HDF 驱动框架是 OpenAtom OpenHarmony(简称"OpenHarmony")系统硬件生态开放的基础,为驱动开发者提供了驱动加载.驱动服务管理和驱动消息机制等驱动框 ...

  2. 部署solr服务

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 一.Sorl单机部署 准备:solr5.5.tomcat8.5.jdk1.8 1.解压 solr-5.5.0.zip压缩包 2.复制./ ...

  3. 高并发报错too many clients already或无法创建线程

    高并发报错 too many clients already 或无法创建线程 本文出处:https://www.modb.pro/db/432236 问题现象 高并发执行 SQL,报错"so ...

  4. NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL、Text2DSL]

    NL2SQL基础系列(1):业界顶尖排行榜.权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL.Text2DSL] Text-to-SQL(或者Text2S ...

  5. nginx重新整理——————http 模块中的请求过程[十一]

    前言 简单介绍一下http的一些指令. 正文 一般http的嵌套规则是这样的: http{ upstream{} split_clients {} map{} gep{} server{ if(){} ...

  6. 重新整理数据结构与算法(c#)—— 线索化二叉树[二十]

    前言 为什么会有线索化二叉树呢? 是这样子的,二叉树呢,比如有n个节点,那么就有n+1个空指针域. 这个是怎么来的呢?比如我们假如一个节点都有左子树和右子树,那么就有2n个节点. 但是我们发现连接我们 ...

  7. C语言专业课复试整理

    C复试专业基础测试整理 运行C程序的步骤和方法 编辑.编译.连接和运行 . 编辑是用户把编写好的C语言源程序输入计算机,以文本文件的形式存放在磁盘上.其标识为:"文件名.c". 编 ...

  8. 深度解读《深度探索C++对象模型》之数据成员的存取效率分析(一)

    接下来我将持续更新"深度解读<深度探索C++对象模型>"系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文和全部的文章列表. 在<深度解 ...

  9. 安装两个jdk Windows系统

    安装两个jdk Windows系统 本来装的是Java 8,现在有一个新的项目要到手上,需要的环境是Java 7,想着还有别的要用,所以就装两个在电脑上 jdk的下载直接去官网就行,不知道怎么下就看这 ...

  10. 深入浅出eBPF|你要了解的7个核心问题

    简介: 过去一年,ARMS基于eBPF技术打造了Kubernetes监控,提供多语言无侵入的应用性能,系统性能,网络性能观测能力,验证了eBPF技术的有效性.eBPF技术和生态发展很好,未来前景广大, ...