LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

使用C#调用系统Windows Win32 API注册表操作

admin
2024年11月15日 8:29 本文热度 355

在C#中,我们可以使用Windows Win32 API来对系统注册表进行操作。注册表是Windows操作系统中用来存储配置信息的重要数据库,我们可以通过C#来读取、写入和删除注册表中的键和值。

下面是一些使用C#调用系统Windows Win32 API注册表操作的示例:

读取注册表键值

RegOpenKeyEx

用于打开指定的注册表键。它的参数说明如下:

  1. hKey:指定要打开的注册表键的句柄。可以是以下值之一:

    • HKEY_CLASSES_ROOT

    • HKEY_CURRENT_USER

    • HKEY_LOCAL_MACHINE

    • HKEY_USERS

    • HKEY_CURRENT_CONFIG

    • 或者其他通过RegCreateKeyEx或RegOpenKeyEx打开的注册表键的句柄。

  2. lpSubKey:要打开的注册表键的名称。例如:"SOFTWARE\MyApp"。

  3. ulOptions:保留参数,通常设置为0。

  4. samDesired:指定打开注册表键的访问权限和选项。可以是以下值之一或它们的组合:

    • KEY_READ(只读)

    • KEY_WRITE(写入)

    • KEY_ALL_ACCESS(完全访问权限)

  5. phkResult:用于接收打开的注册表键的句柄。

函数返回值为整型,表示操作的结果。

RegQueryValueEx

用于检索指定注册表键的值。它的参数说明如下:

  1. hKey:指定要查询的注册表键的句柄。

  2. lpValueName:要查询的注册表值的名称。

  3. lpReserved:保留参数,通常设置为0。

  4. lpType:用于接收键值数据的类型。例如,REG_SZ、REG_DWORD等。

  5. lpData:用于接收键值数据的缓冲区的指针。

  6. lpcbData:指定lpData缓冲区的大小,以字节为单位。在调用函数之前,它指定lpData缓冲区的大小。在函数返回时,它包含实际写入lpData缓冲区的字节数。

函数返回值为整型,表示操作的结果。

using System;using Microsoft.Win32.SafeHandles;using System.Runtime.InteropServices;
class Program{    // 定义Win32 API函数    [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]    public static extern int RegOpenKeyEx(        IntPtr hKey,        string lpSubKey,        int ulOptions,        int samDesired,        out IntPtr phkResult);
   [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]    public static extern int RegQueryValueEx(        IntPtr hKey,        string lpValueName,        int lpReserved,        out uint lpType,        IntPtr lpData,        ref uint lpcbData);
   static void Main()    {        IntPtr hKey;        IntPtr phkResult;        uint lpType;        uint lpcbData = 1024;        IntPtr lpData = Marshal.AllocHGlobal((int)lpcbData);
       // 打开注册表键        int result = RegOpenKeyEx(            new IntPtr((int)RegistryHive.CurrentUser),            "SOFTWARE\\MyApp",            0,            0x20019, // KEY_READ            out phkResult        );
       // 读取键值        result = RegQueryValueEx(            phkResult,            "MySetting",            0,            out lpType,            lpData,            ref lpcbData        );
       string value = Marshal.PtrToStringUni(lpData);
       // 输出键值        Console.WriteLine(value);
       // 释放内存        Marshal.FreeHGlobal(lpData);
       // 关闭注册表键        SafeRegistryHandle safeHandle = new SafeRegistryHandle(phkResult, true);        safeHandle.Dispose();    }}

读取之前需要先创建一个Key

写入注册表键值

RegSetValueEx

用于设置指定注册表键的值。它的参数说明如下:

  1. hKey:指定要设置值的注册表键的句柄。

  2. lpValueName:要设置的注册表值的名称。

  3. reserved:保留参数,通常设置为0。

  4. dwType:指定要设置的值的数据类型。可以是以下值之一:

    • REG_SZ:字符串类型

    • REG_DWORD:双字类型

    • REG_BINARY:二进制数据类型

    • REG_MULTI_SZ:多字符串类型

    • 等等

  5. lpData:指向包含要设置的值的数据的缓冲区的指针。

  6. cbData:指定lpData缓冲区的大小,以字节为单位。

函数返回值为整型,表示操作的结果。

using System;using Microsoft.Win32.SafeHandles;using System.Runtime.InteropServices;
class Program{    // 定义Win32 API函数    [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]    public 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.Unicode, SetLastError = true)]    public static extern int RegSetValueEx(        IntPtr hKey,        string lpValueName,        int reserved,        int dwType,        string lpData,        int cbData);
   static void Main()    {        IntPtr hKey;        IntPtr phkResult;        int lpdwDisposition;
       // 创建或打开注册表键        int result = RegCreateKeyEx(            new IntPtr((int)RegistryHive.CurrentUser),            "SOFTWARE\\MyApp",            0,            null,            0,            0x20006, // KEY_WRITE            IntPtr.Zero,            out phkResult,            out lpdwDisposition        );
       // 写入键值        result = RegSetValueEx(            phkResult,            "MySetting",            0,            1, // REG_SZ            "123",            6        );
       // 关闭注册表键        SafeRegistryHandle safeHandle = new SafeRegistryHandle(phkResult, true);        safeHandle.Dispose();    }}

删除注册表键值

class Program{    // 定义Win32 API函数    [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]    public static extern int RegOpenKeyEx(        IntPtr hKey,        string lpSubKey,        int ulOptions,        int samDesired,        out IntPtr phkResult);
   // 定义Win32 API函数    [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]    public static extern int RegDeleteValue(        IntPtr hKey,        string lpValueName);
   static void Main()    {        IntPtr hKey;        IntPtr phkResult;
       // 打开注册表键        int result = RegOpenKeyEx(            new IntPtr((int)RegistryHive.CurrentUser),            "SOFTWARE\\MyApp",            0,            0x20006, // KEY_WRITE            out phkResult        );
       // 删除键值        result = RegDeleteValue(            phkResult,            "MySetting"        );
       // 关闭注册表键        SafeRegistryHandle safeHandle = new SafeRegistryHandle(phkResult, true);        safeHandle.Dispose();    }}

删除注册表键

class Program{    // 定义Win32 API函数    [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]    public static extern int RegOpenKeyEx(        IntPtr hKey,        string lpSubKey,        int ulOptions,        int samDesired,        out IntPtr phkResult);
   // 定义Win32 API函数    [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]    public static extern int RegDeleteKey(        IntPtr hKey,        string lpSubKey);
   static void Main()    {        IntPtr hKey;        IntPtr phkResult;
       // 打开注册表键        int result = RegOpenKeyEx(            new IntPtr((int)RegistryHive.CurrentUser),            "SOFTWARE",            0,            0x20019, // KEY_READ            out phkResult        );
       // 删除注册表键        result = RegDeleteKey(            phkResult,            "MyApp"        );
       // 关闭注册表键        SafeRegistryHandle safeHandle = new SafeRegistryHandle(phkResult, true);        safeHandle.Dispose();    }}

通过以上示例,我们可以看到如何使用C#调用系统Windows Win32 API注册表操作。需要注意的是,对注册表的操作需要谨慎,不当的操作可能会导致系统故障,建议在操作注册表时谨慎处理。


该文章在 2024/11/15 11:40:21 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved