精华内容
下载资源
问答
  • 允许控件读写注册表
    2019-03-20 15:12:51

     

    1.       注册表简介

    注册表是为Windows NT和Windows95中所有32位硬件/驱动和32位应用程序设计的数据文件,用于存储系统和应用程序的设置信息。16位驱动在Winnt (Windows New Technology)下无法工作,所以所有设备都通过注册表来控制,一般这些是通过BIOS(基本输入输出系统)来控制的。在Win95下,16位驱动会继续以实模式方式设备工作,它们使用system.ini来控制。16位应用程序会工作在NT或者Win95 下,它们的程序仍然会参考win.ini和system.ini文件获得信息和控制。

    2.       注册表结构

    2.1.     简介

    注册表是是Microsoft Windows中的一个重要而又复杂的信息数据库,它是多层次式的。在不同系统上注册表的基本结构相同。其中的复杂数据会在不同方式上结合,从而产生出一个绝对唯一的注册表。从用户的角度看,注册表系统由两个部分组成:注册表数据库和注册表编辑器。注册表数据库包括两个文件:system.dat和user.dat。system.dat用来保存微机的系统信息,如安装的硬件和调和驱动程序的有关信息等。user.dat用来保存每个用户特有的信息,如桌面设置、墙纸或窗口的颜色设置等。由于注册表是最重要的系统文件之一,因此对于它的保护和备份就特别重要。系统在每次成功启动之后都将此次启动时的注册表作一个备份。system.dat的备份文件为system.dao,user.dat的备份文件为user.dao。如果由于某种原因注册表受到破坏,则可以用这两个备份文件来恢复注册表。Win 98/Win Me备份的注册表文件保存在C:/WINDOWS/SYSBCKUP文件夹(这是个隐藏文件夹)中,文件名称是rb000.cab、rb002.cab、rb003.cab、rb004.cab、rb005.cab(通常为五个)。

    2.2.     数据结构

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

    注册表的数据类型主要有以下四种:

    显示类型(在编辑器中)

    数据类型

    说明

    REG_SZ

    字符串

    文本字符串

    REG_MULTI_SZ

    多字符串

    含有多个文本值的字符串

    REG_BINARY

    二进制数

    二进制值,以十六进制显示

    REG_DWORD

    双字

    一个32位的二进制值,显示为8位的十六进制值

    2.3.     几个主键简介

    (1)HKEY_CLASSES_ROOT

    在注册表中HKEY_CLASSES_ROOT是系统中控制所有数据文件的项。HKEY_CLASSES_ROOT控制键包括了所有文件扩展和所有和执行文件相关的文件。它同样也决定了当一个文件被双击时起反应的相关应用程序。 HKEY_CLASSES_ROOT被用作程序员在安装软件时方便的发送信息,在Win95和Winnt中,HKEY_CLASSES_ROOT和HKEY_LOCAL_MACHINE/Software/Classes是相同的。程序员在运行他们的启动程序时不需要担忧实际的位置,相反的,他们只需要在HKEY_CLASSES_ROOT中加入数据就可以了。

    (2)HKEY_CURRENT_CONFIG

    win95一般只使用一个硬件配置文件。如果有多个硬件配置文件。HKEY_LOCAL_MACHINE/Config中就会添加一个键。HKEY_LOCAL_MACHINE/Config包含了HKEY_LOCAL_MACHINE中相同的数据。

    在启动时,你可以选择你愿意使用的配置文件。如果有多个安装,每次系统重新启动时,你就必须选择。HKEY_CURRENT_CONFIG是在启动时控制目前硬件配置的键。在系统启动以后,任何地方的变化都会自动影响到它。程序员经常使用HKEY_CURRENT_CONFIG方便的来存取配置信息。HKEY_CURRENT_CONFIG包括了系统中现有的所有配置文件的细节。你的选择影响了哪一个硬件配置文件成为现在的。举例来说,如果配置0002被选择了,所有0002的配置信息会被映射到这些键上。HKEY_CURRENT_CONFIG允许软件和设备驱动程序员很方便的更新注册表,而不涉及到多个配置文件信息。 HKEY_LOCAL_MACHINE中同样的数据和任何注册表的变化都会同时的变化。

    (3)HKEY_USERS

    HKEY_USERS将缺省用户和目前登陆用户的信息输入到注册表编辑器,在win95中,它仅被那些配置文件激活的登陆用户使用,同样在winnt下,它也是这样。 win95从user.dat中取得他们的信息,winnt从ntuser.dat中取得信息。.dat文件包含了所有基于用户的注册表设置并且允许你取配置这些用户的环境。如果你改变了缺省用户的设置,所有新用户会继承同样的设置。而且,那些已经被建立的用户变的失效。

    (4)HKEY_LOCAL_MACHINE

    HKEY_LOCAL_MACHINE是一个显示控制系统和软件的处理键。HKLM键保存着计算机的系统信息。它包括网络和硬件上所有的软件设置。(比如文件的位置,注册和未注册的状态,版本号等等)这些设置和用户无关,因为这些设置是针对使用这个系统的所有用户的。

    (5)HKEY_CURRENT_USER

    HKEY_CURRENT_USER包含着在HKEY_USERS安全辨别里列出的同样信息。任何在HKEY_CURRENT_USER里的改动也都会立即HKEY_USERS改动。相反也是这样。   HKEY_CURRENT_USER允许程序员和开发者易于存取目前登陆用户的设置。通过建立这个键,微软很容易在不涉及到用户的SID下改变,添加和设置。也就是说,所有当前的操作改变只是针对当前用户而改变,并不影响其他用户。

    3.       C++操作注册表

    3.1.     CRegKey 类及主要使用和函数说明

    所需要头文件:atlbase.h  

    常用函数

    (1) 打开一个键的函数:

    1RegOpenKeyEx

    函数定义:LONG RegOpenKeyEx(HKEY hKey,//已经打开的键的句柄,或者直接是上述几个根键

                                  LPCTSTR lpSubKey,//要打开的子键名字的地址

                                  DWORD ulOptions,//保留值,必须为0

                                  REGSAM samDesired,//打开方式,如读还是写

                                  PHKEY phkResult//返回的打开的子键的句柄

                                   );

    2RegOpenKey 这个函数与Windows 3.1兼容。基于Win32的应用程序应该使用RegOpenKeyEx函数。

    LONG RegOpenKey(HKEY hKey,        // 要打开键的句柄
                         LPCTSTR lpSubKey, // 要打开子键的名字的地址
                         PHKEY phkResult   // 要打开键的句柄的地址
                         );

    注意:RegOpenKey这个函数与Windows 3.1兼容。基于Win32的应用程序应该使用RegOpenKeyEx函数。

    (2)查询某一个键值:RegQueryValueEx

        函数定义:LONG RegQueryValueEx(HKEY hKey,//要查询的键的句柄

                                       LPCTSTR lpValueName,//要查询的键值的名称

                                       LPDWORD lpReserved,//保留值

                                       LPDWORD lpType,//要查询的数据的类型

                                       LPBYTE lpData,//要返回的查询的数据

                                       LPDWORD lpcbData//预置的数据的长度

                                      );

    (3)设置一个键值RegSetValueEx

        函数定义:LONG RegSetValueEx(HKEY hKey,//要设置的键的句柄

                                     LPCTSTR lpValueName,//要访问的键值的名称

                                     LPDWORD lpReserved,//保留值

                                     DWORD dwType,//要设置的数据的类型

                                     const BYTE *lpData,//要设置的健值

                                     DWORD cbData//数据的长度

                                    );

    (4)新建指定键RegCreateKey

    函数定义:LONG RegCreateKey (HKEY  hkey, // 要打开键的句柄

    LPCTSTR lpsubkey, // 要打开子键的名字的地址

    PHKEY phkresult // 已打开句柄的缓存区的地址

    );

    注意:如果这个键在注册表中已经存在,这个函数打开它。

    (5)删除

    1删除注册表指定键下的值 

    LONG RegDeleteValue(HKEY hKey,            //子键的句柄

    LPCTSTR lpValueName  //删除键值的名称

    );

     

    2删除注册表项 (注册表文件夹)就用

    LONG RegDeleteKey(HKEY hKey,        //已打开的键的句柄

    LPCTSTR lpSubKey //要删除的子键或路径

    );

    RegDeleteKey 也可用来删除一个键值。在 Win 95/98 平台下,也可用来删除整个子键和键值。但是在Windows NT/2000平台下,只能用来删除没有子键的键。

    3删除一个带有很多子键值的键

    DWORD SHDeleteKey(HKEY    hkey,// 注册表打开的键值的句柄

    LPCTSTR  pszSubKey //被删除的键值名称

    );

    当然你得包含头文件shlwapi.h,并且添加shlwapi.lib。

    注意:这个函数很危险,如在你的程序中使用SHDeleteKey(hkey,NULL),将删除HKEY_CURRENT_USER//SOFTWARE//Microsoft//Windows//CurrentVersion//Run下的所有值;如果使用SHDeleteKey(HKEY_CURRENT_USER,”SOFTWARE//Microsoft//Windows//CurrentVersion//Run”),将删除HKEY_CURRENT_USER//SOFTWARE//Microsoft//Windows//CurrentVersion//Run这个键以及下面的所有子键和值。

    3.2.     实例

    (1)读取注册表

    1查看HKEY_CURRENT_USER主键下Software//武汉帷幄信息技术有限公司//施工工艺决策系统//系统配置//BCGPGanttControls//GanttChartBCGPGantt-0子键中名称为GridProgressColumnIndex的值,其类型为DWORD。

    void  OnBnClickedQuery() //响应按钮IDC_QUERY

    {

        HKEY hKEY;//定义有关的hKEY,在查询结束时要关闭

        //打开与路径data_Set相关的hKEY

        LPCTSTR data_Set= _T("/Software//武汉帷幄信息技术有限公司//施工工艺决策系统//系统配置//BCGPGanttControls//GanttChartBCGPGantt-0");

        //访问注册表,hKEY则保存此函数所打开的键的句柄

    if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER,data_Set,0,KEY_READ,&hKEY))

        {

                      DWORD dwValue;

                      DWORD dwSize = sizeof(DWORD);

                      DWORD dwType = REG_DWORD;

                    if (::RegQueryValueEx(hKEY,_T("GridProgressColumnIndex"), 0, &dwType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)

                      {

                             AfxMessageBox(_T("错误:无法查询有关的注册表信息"));

                      }

               //程序结束,关闭打开的hKEY

               ::RegCloseKey(hKEY);

        }

        UpdateData(false);

        // TODO: 在此添加控件通知处理程序代码

    }

    可以看到读取的注册表GridProgressColumnIndex的值是正确的。

    2查看HKEY_LOCAL_MACHINE主键下SOFTWARE//Microsoft//Windows NT//CurrentVersion子键中名称为"SoftwareType的值,其类型为REG_SZ。

    void OnBnClickedQuery()

    {

           HKEY hKEY;//定义有关的hKEY,在查询结束时要关闭

           //打开与路径data_Set相关的hKEY

           LPCTSTR data_Set= _T("SOFTWARE//Microsoft//Windows NT//CurrentVersion");

           //访问注册表,hKEY则保存此函数所打开的键的句柄

           if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_READ,&hKEY))

           {

                  char dwValue[256];

                  DWORD dwSzType = REG_SZ;

                  DWORD dwSize = sizeof(dwValue);

     

               if (::RegQueryValueEx(hKEY,_T("SoftwareType"), 0, &dwSzType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)

                  {

                         AfxMessageBox(_T("错误:无法查询有关的注册表信息"));

                  }

                  //程序结束,关闭打开的hKEY

                  ::RegCloseKey(hKEY);

           }

           UpdateData(false);

           // TODO: 在此添加控件通知处理程序代码

    }

    (2)写注册表

    1在HKEY_CURRENT_USER主键下写一个Software//武汉帷幄信息技术有限公司//test111子键,设置其名称为Name,类型为DWORD,值为6。

    void OnBnClickedChange()//响应按钮IDC_CHANGE

    {

           HKEY hKey;//定义有关的hKEY,在查询结束时要关闭

           HKEY hTempKey;

           DWORD dwValue = 6;

           DWORD dwSize = sizeof(DWORD);

           DWORD dwType = REG_DWORD;

           //打开与路径data_Set相关的hKEY

           LPCTSTR data_Set= _T("Software//武汉帷幄信息技术有限公司");

           if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))

           {

                  // 使用hKey来操作data_Set这个KEY里面的值。

           if (ERROR_SUCCESS == ::RegCreateKey(hKey, _T("test111"), &hTempKey))

                  {//背景色

                        if (ERROR_SUCCESS != ::RegSetValueEx(hTempKey, _T("Name"), 0, REG_DWORD, (CONST BYTE*)&dwValue, sizeof(DWORD)))

                         {

                                AfxMessageBox(_T("错误"));

                                ::RegCloseKey(hKey);

                                return;

                         }

                  }

           }

           ::RegCloseKey(hKey);

           // TODO: 在此添加控件通知处理程序代码

    }

    2在HKEY_CURRENT_USER主键下写一个Software//武汉帷幄信息技术有限公司//test111子键,设置其名称为Name,类型为REG_SZ,值为China。

    void OnBnClickedChange()

    {

           HKEY hKey;//定义有关的hKEY,在查询结束时要关闭

           HKEY hTempKey;

           CString m_name = "China";

           LPBYTE m_name_Set = CString_To_LPBYTE(m_name);//定义x轴名称

           DWORD length = m_name.GetLength() + 1;//定义数据长度

           //打开与路径data_Set相关的hKEY

           LPCTSTR data_Set= _T("Software//武汉帷幄信息技术有限公司");

           if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))

           {

                  // 使用hKey来操作data_Set这个KEY里面的值。

           if (ERROR_SUCCESS == ::RegCreateKey(hKey, _T("test111"), &hTempKey))

                  {

                         if (ERROR_SUCCESS != ::RegSetValueEx(hTempKey, _T("Name"), 0, REG_SZ, m_name_Set, length))

                         {

                                AfxMessageBox(_T("错误"));

                                ::RegCloseKey(hKey);

                                return;

                         }

                  }

     

           }

           ::RegCloseKey(hKey);

           UpdateData(false);

           // TODO: 在此添加控件通知处理程序代码

           }

    3在HKEY_CURRENT_USER主键下写一个Software//武汉帷幄信息技术有限公司//test111子键,设置其名称为Name,类型为REG_ BINARY,值为ff ac 05 4e。

    void OnBnClickedChange()

    {

           HKEY hKey;//定义有关的hKEY,在查询结束时要关闭

           HKEY hTempKey;

           BYTE   m_name[10];

           memset(m_name, 0, sizeof(m_name));//将数组m_name清零

           m_name[0] = 0xff;

           m_name[1] = 0xac;

           m_name[2] = 0x05;

           m_name[4] = 0x4e;

           //打开与路径data_Set相关的hKEY

           LPCTSTR data_Set= _T("Software//武汉帷幄信息技术有限公司");

           if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))

           {

                  // 使用hKey来操作data_Set这个KEY里面的值。

           if (ERROR_SUCCESS == ::RegCreateKey(hKey, _T("test111"), &hTempKey))

                  {

                       if (ERROR_SUCCESS != ::RegSetValueEx(hTempKey, _T("Name"), 0, REG_BINARY,(unsigned char*)m_name,5))

                         {

                                AfxMessageBox(_T("错误"));

                                ::RegCloseKey(hKey);

                                return;

                         }

                  }

     

           }

           ::RegCloseKey(hKey);

           UpdateData(false);

           // TODO: 在此添加控件通知处理程序代码

    }

    (3)删除注册表

    1删除HKEY_CURRENT_USER//Software//武汉帷幄信息技术有限公司//test111的键值Name

    void OnBnClickedDelete()

    {

           HKEY hKey;//定义有关的hKEY,在查询结束时要关闭

           //打开与路径data_Set相关的hKEY

           LPCTSTR data_Set= _T("Software//武汉帷幄信息技术有限公司//test111");

           if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))

           {

                  // 使用hKey来操作data_Set这个KEY里面的值。

                  if (ERROR_SUCCESS != ::RegDeleteValue(hKey, _T("Name")))

                  {

                         AfxMessageBox(_T("错误"));

                         ::RegCloseKey(hKey);

                         return;

                  }

     

           }

           ::RegCloseKey(hKey);

           UpdateData(FALSE);

           // TODO: 在此添加控件通知处理程序代码

    }

    2删除HKEY_CURRENT_USER//Software//武汉帷幄信息技术有限公司下的子键

    test111。

    void OnBnClickedDelete()

    {

           HKEY hKey;//定义有关的hKEY,在查询结束时要关闭

           //打开与路径data_Set相关的hKEY

           LPCTSTR data_Set= _T("Software//武汉帷幄信息技术有限公司");

           if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))

           {

                  // 使用hKey来操作data_Set这个KEY里面的值。

                  if (ERROR_SUCCESS != ::RegDeleteKey(hKey, "test111"))

                  {

                         AfxMessageBox(_T("错误"));

                         ::RegCloseKey(hKey);

                         return;

                  }

     

           }

           ::RegCloseKey(hKey);

           UpdateData(FALSE);

           // TODO: 在此添加控件通知处理程序代码

    }

    更多相关内容
  • 修改注册表,让它允许运行ActiveX控件,对于要经常用到.CAB的很有用哦,
  • 一款内置了提取图标、打开程序、显示程序信息、读写INI文件,读写注册表,Winsock等简单的技术的Windows助手程序,适合Delphi初学者学习!相比上一版,本次版本做了如下改动:  1.取消了上一版本使用的VclSkin皮肤控件...
  • C#读写注册表

    万次阅读 2017-03-13 15:37:55
    自Windows95以来的所有Windows版本中,注册表是包含Windows安装,用户首选项,以及已安装软件和设备的所有配置信息的核心存储库。目前,几乎所有的商用软件都使用注册表来存储这些信息,COM组件必须把它们的信息存储...

    自Windows95以来的所有Windows版本中,注册表是包含Windows安装,用户首选项,以及已安装软件和设备的所有配置信息的核心存储库。目前,几乎所有的商用软件都使用注册表来存储这些信息,COM组件必须把它们的信息存储在注册表中,才能有客户端调用。.NET Framework引入了独立存储器的概念,通过它应用程序可以在文件中存储专用于每个用户的信息,.NET Framework将确保为每个在机器上注册的用户单独地存储数据。

    注册表的库和.NET库一样复杂,它包括访问注册表的类。其中有两个类涉及注册表,即Registry和RegistryKey,这两个类都在Microsoft Win32 名称控件中。

    1.先介绍一下注册表

    注册表的层次结构非常类似于文件系统的层次结构。查看和修改注册表的内容的一般方式是使用regedit或regedt32应用程序。

    在运行中输入:regedit,可以看到如下界面:

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    2.NET 注册表类

    要访问注册表,就可以使用Registry和RegistryKey。

    RegistryKey实例表示一个注册表键。这个类实现的方法可以浏览子键,创建新键,读取或修改键中的值。换句话说,通过这类可以实现对注册建所有的操作,包括设置键的安全级别。

    Registry类只能对注册表键进行单一的访问,以执行简单的操作。Registry类的另一个作用是提供表示顶级键的RegistryKey实例,以便开始在注册表中定位。Registry通过静态属性来提供这些实例。

    那么接下来先介绍一下Registry 类

    作用:提供了 RegistryKey 表示 Windows 注册表中的根键的对象和 static 方法,以访问键/值对。

    Registry方法

    名称说明
    GetValue(String, String, Object)检索与指定的注册表项中具有指定名称关联的值。 如果未在指定的键中找到的名称,将返回你提供一个默认值或 null 如果指定的键不存在。
    SetValue(String, String, Object)设置指定的注册表项指定的名称/值对。 如果指定的键不存在,则创建它。
    SetValue(String, String, Object, RegistryValueKind)使用指定的注册表数据类型的指定的注册表项设置的名称/值对。 如果指定的键不存在,则创建它。

    Registry字段

    名称说明
    ClassesRoot定义文档以及与这些类型相关联的属性类型 (或类)。 此字段中读取的 Windows 注册表基项 HKEY_CLASSES_ROOT。
    CurrentConfig包含与不是特定于用户的硬件相关的配置信息。 此字段中读取的 Windows 注册表基项 HKEY_CURRENT_CONFIG。
    CurrentUser包含有关当前用户首选项的信息。 此字段中读取的 Windows 注册表基项 HKEY_CURRENT_USER
    DynData已过时。 包含动态注册表数据。 此字段中读取的 Windows 注册表基项 HKEY_DYN_DATA。
    LocalMachine包含为本地计算机的配置数据。 此字段中读取的 Windows 注册表基项 HKEY_LOCAL_MACHINE。
    PerformanceData包含软件组件的性能信息。 此字段中读取的 Windows 注册表基项 HKEY_PERFORMANCE_DATA。
    Users包含有关默认用户配置信息。 此字段中读取的 Windows 注册表基项 HKEY_USERS。

    3.备注

    此类提供在运行 Windows 的计算机上的注册表中找到的标准的根键的集合。 注册表是有关应用程序、 用户和默认的系统设置的信息存储设施。 例如,应用程序可以使用注册表来存储信息,必须关闭该应用程序之后, 被保留并重新加载应用程序时访问这些信息。 例如,您可以存储颜色首选项、 屏幕位置或窗口的大小。 通过将信息存储在注册表中的其他位置,可以控制每个用户的此数据。

    基或根 RegistryKey 实例公开的 Registry 类描述的子项和值在注册表中的基本存储机制。 所有键都是只读的因为注册表取决于它们存在。 通过公开的项 Registry 是︰

    名称说明
    ClassesRoot存储有关类型 (类) 的信息以及它们的属性。
    CurrentConfig将存储非特定于用户的硬件信息。
    CurrentUser存储有关用户首选项的信息。
    DynData将动态数据存储。
    LocalMachine存储在本地计算机的配置信息。
    PerformanceData存储软件组件的性能的信息。
    Users存储有关默认用户配置信息。

    一旦确定要在其下存储/检索信息从注册表的根密钥,您可以使用 RegistryKey 类来添加或删除子项,并处理给定键的值。

    硬件设备可以将信息放在使用自动插接口注册表中。 用于安装设备驱动程序软件可以通过写入到标准 Api 在注册表中放信息。

    用于获取和设置值的静态方法

    在.NET Framework 2.0 版中, Registry 类还包含 staticGetValue 和 SetValue 用于设置和从注册表项中检索值的方法。 这些方法都将打开和关闭注册表项的每个使用它们,因此它们不会执行的时间以及中的类似方法 RegistryKey 类,当您访问大量的值。

    RegistryKey 类还提供了允许您设置的注册表项,以进行检索之前,测试一个值的数据类型并删除注册表项的 Windows 访问控制安全性的方法。

    示例

    示例 1

    下面的代码示例演示如何检索 HKEY_USERS 项的子项并打印到屏幕的名称。 使用 OpenSubKey 方法来创建感兴趣的特定子项的一个实例。 然后,可以使用中的其他操作 RegistryKey 来操作该注册表项。

    using System;
    using Microsoft.Win32;
    
    class Reg {
        public static void Main() {
    
            // Create a RegistryKey, which will access the HKEY_USERS
            // key in the registry of this machine.
            RegistryKey rk = Registry.Users;
    
            // Print out the keys.
            PrintKeys(rk);
        }
    
        static void PrintKeys(RegistryKey rkey) {
    
            // Retrieve all the subkeys for the specified key.
            String [] names = rkey.GetSubKeyNames();
    
            int icount = 0;
    
            Console.WriteLine("Subkeys of " + rkey.Name);
            Console.WriteLine("-----------------------------------------------");
    
            // Print the contents of the array to the console.
            foreach (String s in names) {
                Console.WriteLine(s);
    
                // The following code puts a limit on the number
                // of keys displayed.  Comment it out to print the
                // complete list.
                icount++;
                if (icount >= 10)
                    break;
            }
        }
    }

    示例 2

    下面的代码示例将多个数据类型的值存储在一个示例键中创建密钥,因为它这样做了,然后检索并显示的值。 该示例演示如何存储和检索默认 (无名) 的名称/值对,以及如何使用 defaultValue 名称/值对不存在时。

    using System;
    using Microsoft.Win32;
    
    public class Example
    {
        public static void Main()
        {
            // The name of the key must include a valid root.
            const string userRoot = "HKEY_CURRENT_USER";
            const string subkey = "RegistrySetValueExample";
            const string keyName = userRoot + "\\" + subkey;
    
            // An int value can be stored without specifying the
            // registry data type, but long values will be stored
            // as strings unless you specify the type. Note that
            // the int is stored in the default name/value
            // pair.
            Registry.SetValue(keyName, "", 5280);
            Registry.SetValue(keyName, "TestLong", 12345678901234,
                RegistryValueKind.QWord);
    
            // Strings with expandable environment variables are
            // stored as ordinary strings unless you specify the
            // data type.
            Registry.SetValue(keyName, "TestExpand", "My path: %path%");
            Registry.SetValue(keyName, "TestExpand2", "My path: %path%",
                RegistryValueKind.ExpandString);
    
            // Arrays of strings are stored automatically as 
            // MultiString. Similarly, arrays of Byte are stored
            // automatically as Binary.
            string[] strings = {"One", "Two", "Three"};
            Registry.SetValue(keyName, "TestArray", strings);
    
            // Your default value is returned if the name/value pair
            // does not exist.
            string noSuch = (string) Registry.GetValue(keyName, 
                "NoSuchName",
                "Return this default if NoSuchName does not exist.");
            Console.WriteLine("\r\nNoSuchName: {0}", noSuch);
    
            // Retrieve the int and long values, specifying 
            // numeric default values in case the name/value pairs
            // do not exist. The int value is retrieved from the
            // default (nameless) name/value pair for the key.
            int tInteger = (int) Registry.GetValue(keyName, "", -1);
            Console.WriteLine("(Default): {0}", tInteger);
            long tLong = (long) Registry.GetValue(keyName, "TestLong",
                long.MinValue);
            Console.WriteLine("TestLong: {0}", tLong);
    
            // When retrieving a MultiString value, you can specify
            // an array for the default return value. 
            string[] tArray = (string[]) Registry.GetValue(keyName,
                "TestArray",
                new string[] {"Default if TestArray does not exist."});
            for(int i=0; i<tArray.Length; i++)
            {
                Console.WriteLine("TestArray({0}): {1}", i, tArray[i]);
            }
    
            // A string with embedded environment variables is not
            // expanded if it was stored as an ordinary string.
            string tExpand = (string) Registry.GetValue(keyName,
                 "TestExpand", 
                 "Default if TestExpand does not exist.");
            Console.WriteLine("TestExpand: {0}", tExpand);
    
            // A string stored as ExpandString is expanded.
            string tExpand2 = (string) Registry.GetValue(keyName,
                "TestExpand2",
                "Default if TestExpand2 does not exist.");
            Console.WriteLine("TestExpand2: {0}...",
                tExpand2.Substring(0, 40));
    
            Console.WriteLine("\r\nUse the registry editor to examine the key.");
            Console.WriteLine("Press the Enter key to delete the key.");
            Console.ReadLine();
            Registry.CurrentUser.DeleteSubKey(subkey);
        }
    }
    //
    // This code example produces output similar to the following:
    //
    //NoSuchName: Return this default if NoSuchName does not exist.
    //(Default): 5280
    //TestLong: 12345678901234
    //TestArray(0): One
    //TestArray(1): Two
    //TestArray(2): Three
    //TestExpand: My path: %path%
    //TestExpand2: My path: D:\Program Files\Microsoft.NET\...
    //
    //Use the registry editor to examine the key.
    //Press the Enter key to delete the key.

    2.RegistryKey 类

    这里写图片描述

    这里写图片描述

    一:C#注册表项的创建,打开与删除

    1:创建

    创建注册表项主要用到RegistryKey 的CreateSubKey()方法。如:

    RegistryKey key = Registry.LocalMachine;
    RegistryKey software = key.CreateSubKey("software\\test");
    //在HKEY_LOCAL_MACHINE\SOFTWARE下新建名为test的注册表项。如果已经存在则不影响!

    2:打开

    打开注册表项主要用到RegistryKey 的OpenSubKey()方法。如:

    注意,如果该注册表项不存在,这调用这个方法会抛出异常

    RegistryKey key = Registry.LocalMachine;
    RegistryKey software = key.OpenSubKey("software\\test",true);
    //注意该方法后面还可以有一个布尔型的参数,true表示可以写入。

    3:删除

    删除注册表项主要用到RegistryKey 的DeleteSubKey()方法。如:

    RegistryKey key = Registry.LocalMachine;
    key.DeleteSubKey("software\\test",true); //该方法无返回值,直接调用即可
    key.Close();

    注意,如果该注册表项不存在,这调用这个方法会抛出异常

    二:键值的创建(设置值、修改),读取和删除

    1:创建(设置值、修改)

    对键值的创建修改等操作主要用到RegistryKey 的SetValue()方法

    RegistryKey key = Registry.LocalMachine;
    RegistryKey software = key.OpenSubKey("software\\test",true); //该项必须已存在
    software.SetValue("test", "博客园");
    //在HKEY_LOCAL_MACHINE\SOFTWARE\test下创建一个名为“test”,值为“博客园”的键值。如果该键值原本已经存在,则会修改替换原来的键值,如果不存在则是创建该键值。
    // 注意:SetValue()还有第三个参数,主要是用于设置键值的类型,如:字符串,二进制,Dword等等~~默认是字符串。如:
    // software.SetValue("test", "0", RegistryValueKind.DWord); //二进制信息
    Key.Close();

    2:读取

    string info = "";
    RegistryKey Key;
    Key = Registry.LocalMachine;
    myreg = Key.OpenSubKey("software\\test");
    // myreg = Key.OpenSubKey("software\\test",true);
    info = myreg.GetValue("test").ToString();
    myreg.Close();

    info结果为:博客园

    3:删除

    RegistryKey delKey = Registry.LocalMachine.OpenSubKey("Software\\test", true);
    delKey.DeleteValue("test");
    delKey.Close();

    细心的读者可能发现了第二个例子中OpenSubKey()方法参数与其他例子的不同。

    如果你要修改键值,包括创建、设置、删除键值等都要在方法后面加个布尔参数,设置为true,表示可写可改;如果仅仅只是读取键值可以不加,此时可写关闭,你不能再往里写值(当然,你要加也可以true)!

    还有读者提到读写默认键值的问题,主要在设置、读取的方法中将键名置空则就是对默认键值的操作。

    如:

    software.SetValue(“”, “博客园”); // 在HKEY_LOCAL_MACHINE\SOFTWARE\test修改默认键值的值为“博客园”。读取类似!

    另外,默认的键值是不能删除的,所以不要用DeleteValue()方法去删除,会抛出异常的!

    三:判断注册表项是否存在

    private bool IsRegeditItemExist()  
    {  
        string [] subkeyNames;  
        RegistryKey hkml = Registry.LocalMachine;  
        RegistryKey software = hkml.OpenSubKey("SOFTWARE");  
        //RegistryKey software = hkml.OpenSubKey("SOFTWARE", true);  
        subkeyNames = software.GetSubKeyNames();  
        //取得该项下所有子项的名称的序列,并传递给预定的数组中  
        foreach (string keyName in subkeyNames)   
        //遍历整个数组  
        {  
            if (keyName == "test")  
            //判断子项的名称  
            {   
                hkml.Close();  
                return true ;  
            }  
        }  
        hkml.Close();  
        return false;   
    }

    四:判断键值是否存在这里写代码片

    private bool IsRegeditKeyExit()
    {
      string[] subkeyNames;
      RegistryKey hkml = Registry.LocalMachine;
      RegistryKey software = hkml.OpenSubKey("SOFTWARE\\test");
      //RegistryKey software = hkml.OpenSubKey("SOFTWARE\\test", true);
      subkeyNames = software.GetValueNames();
      //取得该项下所有键值的名称的序列,并传递给预定的数组中
      foreach (string keyName  in subkeyNames)
      {
        if (keyName ==  "test") //判断键值的名称
        {
            hkml.Close();
            return true;
        }    
    
      }
      hkml.Close();
      return false;
    }

    http://www.cnblogs.com/txw1958/archive/2012/08/01/csharp-regidit.html

    展开全文
  • 在窗体中加入一个CheckBox控件,加入以下代码: Option Explicit Private Sub Form_Load() Check1.Caption = “开机启动本程序” Check1.Value = WinViler End Sub Private Sub Check1_Click() Dim My Set My = ...

    在这里插入图片描述

    在窗体中加入一个CheckBox控件,加入以下代码:
    Option Explicit

    Private Sub Form_Load()
    Check1.Caption = “开机启动本程序”
    Check1.Value = WinViler
    End Sub

    Private Sub Check1_Click()
    Dim My
    Set My = CreateObject(“WScript.Shell”)
    If Check1.Value > 0 Then '将程序写入注册表的启动项中
    My.regWrite “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run” & App.EXEName, App.Path & “” & App.EXEName & “.exe”, “REG_SZ”
    Else
    If WinViler > 0 Then '如果程序存在注册表则删除
    My.regdelete “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run” & App.EXEName
    End If
    End If
    End Sub

    '读取
    Private Function WinViler() As Long
    Dim My As Object
    Set My = CreateObject(“WScript.Shell”)
    On Error GoTo N
    My.regread “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run” & App.EXEName
    WinViler = 1
    Exit Function
    N: WinViler = 0
    End Function

    展开全文
  • 注册表读写增强模块
  • 易语言注册表读写增强模块源码
  • VS2010开发应用程序读写注册表

    千次阅读 2015-07-15 11:31:45
    注册表是windows操作系统中用于管理存储系统设置的数据库,在应用程序开发过程中,用注册表为应用程序保存相关不经常变动的参数为普遍采用的方式。开发的应用程序可以在注册表中存储自己的数据,然后在开发的应用...

            注册表是windows操作系统中用于管理存储系统设置的数据库,在应用程序开发过程中,用注册表为应用程序保存相关不经常变动的参数为普遍采用的方式。开发的应用程序可以在注册表中存储自己的数据,然后在开发的应用程序中调用,提供了非常便利的方式。​


    一、实现代码(CPP):​

    void CRegEdit::WriteReg()

    {

    HKEY key ;

    if(RegOpenKey(HKEY_LOCAL_MACHINE,strPath,&key)==ERROR_SUCCESS)

    {

    int idata = 123;

    RegSetValueEx(key,_T("COM_LED"),0,REG_DWORD,(BYTE *)&m_Com_LED ,sizeof(DWORD));

    RegSetValueEx(key,_T("COM_PLC"),0,REG_DWORD,(BYTE *)&m_Com_PLC ,sizeof(DWORD));

    RegSetValueEx(key,_T("COM_OS"),0,REG_DWORD,(BYTE *)&m_Com_OS ,sizeof(DWORD));

    RegSetValueEx(key,_T("LED_VALE"),0,REG_DWORD,(BYTE *)&m_LED_Value ,sizeof(DWORD));

    RegSetValueEx(key,_T("FILE"),0,REG_SZ,(BYTE *)m_strFile.GetBuffer(0),m_strFile.GetLength()*sizeof(DWORD));

    RegCloseKey(key);

    return ;

    }

    if(RegCreateKey(HKEY_LOCAL_MACHINE,strPath,&key)==ERROR_SUCCESS)

    {

    RegSetValueEx(key,_T("COM_LED"),0,REG_DWORD,(BYTE *)&m_Com_LED ,sizeof(DWORD));

    RegSetValueEx(key,_T("COM_PLC"),0,REG_DWORD,(BYTE *)&m_Com_PLC ,sizeof(DWORD));

    RegSetValueEx(key,_T("COM_OS"),0,REG_DWORD,(BYTE *)&m_Com_OS ,sizeof(DWORD));

    RegSetValueEx(key,_T("LED_VALE"),0,REG_DWORD,(BYTE *)&m_LED_Value ,sizeof(DWORD));

    RegSetValueEx(key,_T("FILE"),0,REG_SZ,(BYTE *)m_strFile.GetBuffer(0),m_strFile.GetLength()*sizeof(DWORD));

    RegCloseKey(key);

    return ;

    }

    }

    bool CRegEdit::ReadReg()

    {

    HKEY key ;

    if(RegOpenKey(HKEY_LOCAL_MACHINE,strPath,&key)==ERROR_SUCCESS)

    {

    DWORD dwType = REG_DWORD;

    DWORD szType = REG_SZ ;

    DWORD dwData;

    char chData[1024];

    DWORD dwSize ;

    DWORD szSize = 1024 ;

    CString str ;

    RegQueryValueEx(key,_T("COM_LED"),0,&dwType,(BYTE *)&dwData,&dwSize);

    SetCom_LED(dwData);

    RegQueryValueEx(key,_T("COM_PLC"),0,&dwType,(BYTE *)&dwData,&dwSize);

    SetCom_PLC(dwData);

    RegQueryValueEx(key,_T("COM_OS"),0,&dwType,(BYTE *)&dwData,&dwSize);

    SetCom_OS(dwData);

    RegQueryValueEx(key,_T("LED_VALE"),0,&dwType,(BYTE *)&dwData,&dwSize);

    SetLEDValue(dwData);

    RegQueryValueEx(key,_T("FILE"),0,&szType,(BYTE *)&chData,&szSize);

    str.Format(_T("%s"),chData);

    SetFilePath(str);

    return true;

    }

    WriteReg();//for defualt

    return true ;

    }

    二、声明(.h)

    class CRegEdit

    {

    public:

    CRegEdit(void);

    ~CRegEdit(void);

    void WriteReg();

    bool ReadReg();

    void SetCom_LED(int inum);

    int GetCom_LED();

    void SetCom_PLC(int inum);

    int GetCom_PLC();

    void SetCom_OS(int inum);

    int GetCom_OS();

    void SetLEDValue(int iValue);

    int GetLEDValue();

    void SetFilePath(CString strFile);

    CString GetFilePath();

    private:

    CString strPath ;

    int m_Com_LED ;

    int m_Com_PLC;

    int m_Com_OS;

    int m_LED_Value ;

    CString m_strFile;

    };​

     

    三、系统调用​

    void CRegDlg::OnBnClickedWriteReg()

    {

    // TODO: 在此添加控件通知处理程序代码

    m_Reg.WriteReg();

    }

    void CRegDlg::OnBnClickedReadReg()

    {

    // TODO: 在此添加控件通知处理程序代码

    m_Reg.ReadReg();

    }

    博客:http://blog.sina.com.cn/s/blog_141793b190102vsba.html
    展开全文
  • 读写注册表

    2010-11-19 09:31:00
    //写注册表RegistryKey regWrite;//往HKEY_CURRENT_USER主键里的Software子键下写一个名为“Test”的子键//如果Test子键已经存在系统会自动覆盖它regWrite = Registry.CurrentUser.CreateSubKey("Software\\Test");/...
  • C# 写注册表抛异常System.Security.SecurityException:“不允许所请求的注册表访问权。” 解决方案: 因为在win7下,VS访问注册表HKEY_LOCAL_MACHINE,即程序中的LocalMachine是需要管理员身份运行的。但是访问HKEY...
  • 利用Python读取并操作注册表

    千次阅读 2019-08-22 11:48:15
    利用Python读取并操作注册表 一、Python与注册表相关的库 winreg(主要) win32api 二、注册表结构:键、值 三、winreg——访问Windows注册表 1.模块功能: winreg.closeKey(hkey) 关闭以前打开的注册表项。在HKEY...
  • C++读写注册表

    2019-02-16 15:50:20
    1.&nbsp;&nbsp;&nbsp;&nbsp;&...注册表简介 ...16位驱动在Winnt (Windows New Technology)下无法工作,所以所有设备都通过注册表来控制,一般这些是通过BIOS(基本输入输出系统)来...
  • Delphi修改操作注册表权限的例子,用delphi2007编译的,Win7_64位环境下亲测可行。
  • VS2017中MFC里对注册表读写 // MFC02Dlg.cpp : 实现文件 // #include “stdafx.h” #include “MFC02.h” #include “MFC02Dlg.h” #include “afxdialogex.h” #ifdef _DEBUG #define new DEBUG_NEW #endif // C...
  • 自Windows95以来的所有Windows版本中,注册表是包含Windows安装,用户首选项,以及已安装软件和设备的所有配置信息的核心存储库。目前,几乎所有的商用软件都使用注册表来存储这些信息,COM组件必须把它们的信息存储...
  • 获取摄像头 vfw DirectShowLib AForge
  • VB如何在Win10X64位系统上进行读写64位的注册表
  • VS2010注册表读写

    2021-05-21 13:05:15
    注册表是windows操作系统中用于管理存储系统设置的数据库,在应用程序开发过程中,用注册表为应用程序保存...​VS2010注册表数据读写一、实现代码(CPP):​void CRegEdit::WriteReg(){HKEY key ;if(RegOpenKey(HKE...
  • VB 读写注册表

    2013-01-30 00:12:21
    图片:1.jpg[删除] ...打开Visual Studio.NET,选择“新建项目”,在项目类型窗口中选择“Visual Basic项目”,在模板窗口中...向当前窗体上添加两组Group控件,每组上有两个RadioButton选项按钮,将它们分别做成
  • [VB.NET]读写注册表

    千次阅读 2008-12-02 20:58:00
    读写注册表 实例说明在本实例中,我们将制作一个能读写注册表的程序。程序运行后,可以选择要添加、删除、修改或查询的键和键值。程序运行结果如图68-1所示。<!--google_ad_client = "pub-8333940862668978";/* 728...
  • 想写一个能读写注册表控件,编译可以成功。但是在chrome和IE上调用函数来执行RegOpenKeyEx(),不能返回ERROR_SUCCESS。这是为什么。
  • C++builder中注册表读写

    千次阅读 2014-12-22 20:25:28
    在C++builder中读写注册的方法如下: #include #pragma hdrstop #include #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #...
  • [源码]VB6.0操作注册表

    2021-07-12 22:58:44
    VB6.0操作注册表 本文操作的注册表目录是HKEY_CLASSES_ROOT\Directory\Background\shell 也就是桌面菜单右键
  • 一个简单的读写注册表实例(34kb)
  • Visual Studio2008正式发布后吸引了大量的编程人员,为了由原来的Visual ...Visual Studio2008在一些特性上也做出了许多的改进,访问注册表以及系统内核也变得更为方便了。本文主要以Visual Studio2008 当中的VB.ne
  • 在delphi中读写注册表

    2007-10-25 14:37:02
    用Delphi操作Windows 95/NT注册表 类似于Windows 3.x中的ini文件,Windows 95、Windows NT中的注册表记录了有 关Windows系统、应用软件运行时的初始化参数等。用户经常需要在程序中操作注册 表,以控制软件的启动及...
  • 如果用 Python 的话,一般来说是用不到注册表的,配置参数可以放在配置文件中。但在 Windows 下使用,还是避免不...程序代码# 项目:标准库函数# 模块:Windows注册表读写模块# 作者:黄涛# License:GPL# Email:hua...
  • 中建立一个基于对话框(Dialog Base) 的应用程序,在对话框上放上几个Edit control 的控件,如同示例小程序 RegTech 框(见图一), 程序执行时,首先读出注册表信息分别显示在三个编辑栏中,为了演示 写 入操作,你...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,936
精华内容 1,974
热门标签
关键字:

允许控件读写注册表