zoukankan      html  css  js  c++  java
  • windows 注册表操作

    注册表概述

    概述

    注册表是windows操作系统中的一个核心数据库,其中存放着各种参数,直接控制着windows的启动、硬件驱动程序的装载以及一些windows应用程序的运行,从而在整个系统中起着核心作用.这些作用包括了软、硬件的相关配置和状态信息,比如注册表中保存有应用程序和资源管理器外壳的初始条件、首选项和卸载数据等,联网计算机的整个系统的设置和各种许可,文件扩展名与应用程序的关联,硬件部件的描述、状态和属性,性能记录和其他底层的系统状态信息,以及其他数据等.

    数据结构

    注册表由键(或称"项")、子键(子项)和值项构成.一个键就是分支中的一个文件夹,而子键就是这个文件夹中的子文件夹,子键同样是一个键.一个值项则是一个键的当前定义,由名称、数据类型以及分配的值组成.一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值.

    数据类型

    注册表的数据类型主要有以下四种:
    显示类型(在编辑器中)   数据类型    说明                   
    REG_SZ          字符串     文本字符串
    REG_MULTI_SZ       多字符串    含有多个文本值的字符串
    REG_BINARY         二进制数    二进制值,以十六进制显示.
    REG_DWORD        双字      一个32位的二进制值,显示为8位的十六进制值.

    各主键的简单介绍

    • HKEY_LOCAL_MACHINE  是一个显示控制系统和软件的处理键.HKLM键保存着计算机的系统信息.它包括网络和硬件上所有的软件设置.
    • HKEY_CLASSES_ROOT  是系统中控制所有数据文件的项.
    • HKEY_USERS  将缺省用户和目前登陆用户的信息输入到注册表编辑器
    • HKEY_CURRENT_USER  包含着在HKEY_USERS安全辨别里列出的同样信息
    • HKEY_CURRENT_CONFIG  包括了系统中现有的所有配置文件的细节.HKEY_CURRENT_CONFIG允许软件和设备驱动程序员很方便的更新注册表,而不涉及到多个配置文件信息. HKEY_LOCAL_MACHINE中同样的数据和任何注册表的变化都会同时的变化.

    相关函数

    显示相关函数

    [创建键][打开键][删除键][添加/修改键值][删除键值][读取键值]
    创建键 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
    HKEY_CURRENT_USER
    HKEY_LOCAL_MACHINE
    HKEY_USERS


    lpSubKey:   指向一个用于定义子键路径的字符串
    Reserved,dwOptions,samDesired:   置0
    lpClass,lpSecurityAttributes:   置NULL
    phkResult:   用于接收键句柄
    lpdwDisposition:   接收的相关信息,取值如下

    REG_CREATED_NEW_KEY   创建成功
    REG_OPENED_EXISTING_KEY    键已存在

    打开键 RegOpenKeyEx
    函数原型

    LONG RegOpenKeyEx(
    HKEY hKey, // handle to open key
    LPCTSTR lpSubKey, // subkey name
    DWORD ulOptions, // reserved
    REGSAM samDesired, // security access mask
    PHKEY phkResult // handle to open key
    );

    参数说明

    hKey:     要打开键的句柄或以下预定义句柄

    HKEY_CLASSES_ROOT
    HKEY_CURRENT_USER
    HKEY_LOCAL_MACHINE
    HKEY_USERS


    lpSubKey:   指向一个用于定义子键路径的字符串
    ulOptions:   保留位,置0
    samDesired:   打开键后键的操作权限
    phResult:   接收打开的键的句柄

    删除键 RegDeleteKey
    函数原型

    LONG RegDeleteKey(
    HKEY hKey, // handle to open key
    LPCTSTR lpSubKey // subkey name
    );

    参数说明

    hKey:   要打开键的句柄或以下预定义句柄

    HKEY_CLASSES_ROOT
    HKEY_CURRENT_USER
    HKEY_LOCAL_MACHINE
    HKEY_USERS


    lpSubKey:   指向一个用于定义子键路径的字符串

    修改/添加键值 RegSetValueEx
    函数原型

    LONG RegSetValueEx(
    HKEY hKey, // handle to key
    LPCTSTR lpValueName, // value name
    DWORD Reserved, // reserved
    DWORD dwType, // value type
    CONST BYTE *lpData, // value data
    DWORD cbData // size of value data
    );

    参数说明

    hKey:   打开键的句柄或以下预定义句柄

    HKEY_CLASSES_ROOT
    HKEY_CURRENT_USER
    HKEY_LOCAL_MACHINE
    HKEY_USERS


    lpValueName:   键值的名称
    Reserved:   保留位,置0
    dwType:   键值的类型
    lpData:   键值
    cbData:   键值数据长度

    删除键值 RegDeleteValue
    函数原型

    LONG RegDeleteValue(
    HKEY hKey, // handle to key
    LPCTSTR lpValueName // value name
    );

    参数说明

    hKey:   打开键的句柄或以下预定义句柄

    HKEY_CLASSES_ROOT
    HKEY_CURRENT_USER
    HKEY_LOCAL_MACHINE
    HKEY_USERS


    lpValueName:   键值的名称

    读取键值 RegQueryValueEx
    函数原型

    LONG RegQueryValueEx(
    HKEY hKey, // handle to key
    LPCTSTR lpValueName, // value name
    LPDWORD lpReserved, // reserved
    LPDWORD lpType, // type buffer
    LPBYTE lpData, // data buffer
    LPDWORD lpcbData // size of data buffer
    );

    参数说明

    hKey:   打开键的句柄或以下预定义句柄

    HKEY_CLASSES_ROOT
    HKEY_CURRENT_USER
    HKEY_LOCAL_MACHINE
    HKEY_USERS


    lpValueName:   键值的名称
    Reserved:   保留位,置0
    lpType:   接收键值的类型
    lpData:   接收键值
    lpcbData:   接收键值数据长度


    注册表编程(利用注册表写开机启动程序)

    执行流程

    代码样例

    运行结果:

    删除键

    修改/创建键值

    运行结果:

    读取键值

    运行结果(读取"test"键值):

    删除键值

    运行结果:

    程序源码

    #include <windows.h>
    #include <iostream>
    #include <cstdlib>
    using namespace std;

    void main()
    {
    HKEY hKey;
    LPCTSTR lpRun = "Software\_MyTest";
    DWORD state,dwtype,sizeBuff;
    long lRet;
    char reBuff[10] = {0};


    /*创建键***************************************************************************/
    ////创建键
    //lRet = RegCreateKeyEx(HKEY_CURRENT_USER,lpRun,0,NULL,0,0,NULL,&hKey,&state);
    //if(lRet == ERROR_SUCCESS)
    //{
    // if(state == REG_CREATED_NEW_KEY)
    // cout<<"表项创建成功"<<endl;
    //
    // //关闭键
    // RegCloseKey(hKey);
    //}


    /*打开/修改键值********************************************************************/
    ////打开键
    //lRet= RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_WRITE, &hKey);
    //if(lRet == ERROR_SUCCESS)
    //{
    // //创建或者修改键值
    // RegSetValueEx(hKey, "test",0,REG_SZ,(BYTE *)"success",10);
    //
    // //关闭键
    // RegCloseKey(hKey);
    //}


    /*读取键值*************************************************************************/
    ////打开键
    //lRet= RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_READ, &hKey);
    //if(lRet == ERROR_SUCCESS)
    //{
    // sizeBuff = sizeof(reBuff);
    //
    // //读取键值
    // if(RegQueryValueEx(hKey,"test",0,&dwtype,(BYTE*)reBuff,&sizeBuff) == ERROR_SUCCESS)
    // cout<<reBuff<<endl;
    //
    // //关闭键
    // RegCloseKey(hKey);
    //}


    /*删除键值************************************************************************/
    ////打开键
    //lRet = RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_WRITE, &hKey);
    //if(lRet==ERROR_SUCCESS)
    //{
    // //删除键
    // RegDeleteValue(hKey,"test");
    //
    // //关闭键
    // RegCloseKey(hKey);
    //}


    /*删除键**************************************************************************/
    RegDeleteKey(HKEY_CURRENT_USER,lpRun);

    system("pause");
    }

    利用注册表写开机启动程序

    说明:

    通过向注册表 HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun 中添加键值来让程序在开机时被系统加载.

    步骤:

    • 设置开机启动
        
    • 取消开机启动
        

    程序源码:

    //这里用的是宽字符,既 wchar_t

    if(isStartOpen)
    {
    //开机启动
    HKEY hKey;
    LPCTSTR lpRun = L"Software\Microsoft\Windows\CurrentVersion\Run";
    //---------------找到系统的启动项
    long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
    //-----------打开启动项Key
    if(lRet == ERROR_SUCCESS)
    {
    wchar_t pFileName[MAX_PATH] = {0};
    DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH);
    //----------------得到程序自身的全路径
    lRet = RegSetValueEx(hKey, L"DeskPro",0,REG_SZ,(BYTE *)pFileName,dwRet*2);
    //----------------添加或者修改注册表项
    RegCloseKey(hKey);
    //----------------关闭注册表
    }
    }
    else
    {
    //取消卡机启动
    HKEY hKey;
    LPCTSTR lpRun = L"Software\Microsoft\Windows\CurrentVersion\Run";
    //---------------找到系统的启动项
    long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
    if(lRet==ERROR_SUCCESS)
    {
    RegDeleteValue(hKey,L"DeskPro");
    //----------------删除注册表项
    RegCloseKey(hKey);
    //----------------关闭注册表
    }
    }

  • 相关阅读:
    HDU 1982 Kaitou Kid The Phantom Thief (1)
    HDU 1984 Mispelling4
    HDU 2546 饭卡
    HDU 1009 FatMouse' Trade
    在VC 中如何隐藏一个主程序窗口
    .菜单项
    SetClassLong,GetClassLong 动态改变光标
    .窗口捕获鼠标
    .主窗口向子控件发送消息
    线段树 1698 Just a Hook 区间set更新
  • 原文地址:https://www.cnblogs.com/xiaogui9527/p/3280905.html
Copyright © 2011-2022 走看看