zoukankan      html  css  js  c++  java
  • windowsAPI函数操作注册表实现软件开机自启

    注册表的结构

    注册表是一个数据库,它的结构同逻辑磁盘类似。注册表包含键(Key),它类似磁盘中的目录,注册表还包含键值(Value),它类似磁盘中的文件。一个键可以包含多个子健和键值,其中键值用于存储数据,顶层建称为根键,注册表的根键如下图(Win+R 输入命令 regedit ):

    下面介绍几个windowsAPI函数来操作注册表,并实现软件开机自启。C/C++代码,只要能包含头文件windows.h都可以调用此API函数实现开机自启.

    RegCreateKeyEx函数

    创建指定的注册表项。如果键已经存在,函数将打开它。

    LONG RegCreateKeyEx(
      HKEY hKey,                                  // handle to open key
      LPCTSTR lpSubKey,                           // subkey name
      DWORD Reserved,                             // reserved
      LPTSTR lpClass,                             // class string
      DWORD dwOptions,                            // special options
      REGSAM samDesired,                          // desired security access
      LPSECURITY_ATTRIBUTES lpSecurityAttributes, // inheritance
      PHKEY phkResult,                            // key handle 
      LPDWORD lpdwDisposition                     // disposition value buffer
    );

    参数

    hkey

    当前打开的密钥或以下预定义密钥之一的句柄:

    根键:

    HKEY_CLASSES_ROOT** 存储文件关联和COM对象注册信息

    HKEY_CURRENT_CONFIG** 存储硬件配置信息

    HKEY_CURRENT_USER** 存储与当前登录账户相关的信息

    HKEY_LOCAL_MACHINE** 存储系统相关的信息

    HKEY_USERS** 存储所有账户信息

    win+R,输入regedit命令打开注册表

     lpSubKey

    指向空终止字符串的指针,该字符串指定此函数打开或创建的子键的名称。

    上图中的路径,文件夹路径`:子健

    示例:开机自启注册表

    char *szSubKey = "Software\Microsoft\Windows\CurrentVersion\Run";

    RegCreateKeyEx函数打开或创建的键是由hKey参数标识的键的子键

    返回值

    如果函数成功,返回值为**ERROR_SUCCESS**

    如果函数失败,返回值是Winerror.h中定义的非零错误代码。您可以使用FormatMessage函数和FORMAT_MESSAGE_FROM_SYSTEM标志来获得错误的通用描述。

    RegSetValueEx函数

    在注册表项下设置指定值的数据和类型。

    LONG RegSetValueEx(
      HKEY hKey,           // 键值所在子健的子健句柄
      LPCTSTR lpValueName, // 要设置的键值名称
      DWORD Reserved,      // 为0
      DWORD dwType,        // 要设置的键值的数据类型
      CONST BYTE *lpData,  // 键值数据缓冲区
      DWORD cbData         // 缓冲区长度
    );

    参数

    hKey

    RegCreateKeyEx设置的hkey

    lpValueName

    名称

    lpData

    开机自启程序名称(包含路径)

    GetModuleFileName

    获取执行文件的文件名(包含路径)

    char szModule[MAX_PATH];
    GetModuleFileName(NULL, szModule, MAX_PATH);

    RegDeleteValue函数

    在注册表项下删除指定值的数据和类型

    LONG RegDeleteValueW (
        HKEY hKey,                //键值所在子健的子健句柄
        LPCWSTR lpValueName        //要删除的键值名称
    );

    RegQueryValueEx函数

    查询所打开注册表键所关联的一个给定值的类型和数据

    LONG RegQueryValueEx(  HKEY hKey,           // 要查询键的句柄  
        LPTSTR lpValueName,  // 要查询值的名字的地址  
        LPDWORD lpReserved,  // 保留  
        LPDWORD lpType,      // 值类型缓存地址  
        LPBYTE lpData,       // 数据缓存地址  
        LPDWORD lpcbData     // 数据缓存大小地址
    ); 

    注册表API应用实例(开机自启)

    设置、取消、查询开机自启

    VC6.0,VS(设置多字节字符集)可直接运行成功

    设置,查询注册表键值

    #include <stdio.h>
    #include <windows.h>
    int main()
    {
        // 根键、子键名称、和到子键的句柄
        HKEY hRoot = HKEY_CURRENT_USER;    
        char *szSubKey = "Software\Microsoft\Windows\CurrentVersion\Run";
        HKEY hKey;
    
        // 打开指定子键
        DWORD dwDisposition = REG_OPENED_EXISTING_KEY;    // 如果不存在不创建
        LONG lRet = RegCreateKeyEx(hRoot, szSubKey, 0, NULL,
            REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);
        if (lRet != ERROR_SUCCESS)
            return -1;
    
        // 得到当前执行文件的文件名(包含路径)
        char szModule[MAX_PATH];
        GetModuleFileName(NULL, szModule, MAX_PATH);
        printf("要设置的键值数据为:%s
    ", szModule);
        // 创建一个新的键值,设置键值数据为文件名 SelfRunDemo为名称,相同会覆盖
        lRet = RegSetValueEx(hKey, "SelfRun", 0, REG_SZ, (BYTE*)szModule, strlen(szModule));
        if (lRet == ERROR_SUCCESS)
        {
            printf("自动启动设置成功!
    ");
        }
        //查询键值
        DWORD len;
        memset(szModule,'', sizeof(szModule));
        lRet = RegQueryValueEx(hKey, "SelfRun", 0, NULL, (BYTE*)szModule, &len);
        printf("要查询的键值数据为:%s
    ", szModule);
    
        // 关闭子键句柄
        RegCloseKey(hKey);
        getchar();
        return 0;
    }

    #### 删除注册表键值

    #include <stdio.h>
    #include <windows.h>
    int main()
    {
        // 根键、子键名称、和到子键的句柄
        HKEY hRoot = HKEY_CURRENT_USER;    
        char *szSubKey = "Software\Microsoft\Windows\CurrentVersion\Run";
        HKEY hKey;
    
        // 打开指定子键
        DWORD dwDisposition = REG_OPENED_EXISTING_KEY;    // 如果不存在不创建
        LONG lRet = RegCreateKeyEx(hRoot, szSubKey, 0, NULL,
            REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);
        if (lRet != ERROR_SUCCESS)
            return -1;
    
        // 得到当前执行文件的文件名(包含路径)
        char szModule[MAX_PATH];
        GetModuleFileName(NULL, szModule, MAX_PATH);
        printf("要设置的键值数据为:%s
    ", szModule);
        // 创建一个新的键值,设置键值数据为文件名 SelfRunDemo为名称,相同会覆盖
        lRet = RegSetValueEx(hKey, "SelfRun", 0, REG_SZ, (BYTE*)szModule, strlen(szModule));
        if (lRet == ERROR_SUCCESS)
        {
            printf("自动启动设置成功!
    ");
        }
        //删除键值
        lRet = RegDeleteValue(hKey, "SelfRun");
        if (lRet == ERROR_SUCCESS)
        {
            printf("删除成功!
    ");
        }
        // 关闭子键句柄
        RegCloseKey(hKey);
        getchar();
        return 0;
    }

    如何查看是否设置开机自启了呢,win+R,输入命令regedit,找到路径:`计算机HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun`

    可以看到SelfRun已经添加到注册表了

    当然,你也可以重启一下电脑

    最后,这几个AIP是可以在任何包含「windows.h」头文件的程序上运行的,完全可以操作注册表,但是这「不是唯一」可以操作注册表的方式,不同的框架封装了不同的可去实现注册表的操作,例如「MFC」的「CRegKey」类,「Qt」的「QSetting」类。

  • 相关阅读:
    &nbsp|&quot|&amp|&lt|&gt等html字符转义
    OpenSSL: 消息摘要算法
    Linux下tcp协议socket的recv函数返回时机分析(粘包)
    ipv6
    Electron 调用系统工具记事本、计算器等
    MySQL 导出函数与存储过程
    远程连接Ubuntu桌面配置
    当Activity继承AppCompatActivity如何实现隐藏标题栏与状态栏
    spring boot 1.5.2 操作mongodb3.4.0
    VScode-Go can't load package: package .: no buildable Go source files in
  • 原文地址:https://www.cnblogs.com/deroy/p/13455457.html
Copyright © 2011-2022 走看看