本人在开发IE主页修改器时,想通过MFC中的函数操作注册表来实现功能,因此在开发前整理了本篇文章。
1.简介
CRegKey提供了对系统注册表的操作方法,通过CRegKey类,可以方便的打开注册表的某个分支或子键(CRegKey::Open),可以方便的修改一个键的键值(CRegKey::SetValue),也可以查询某个键的键值(CRegKey::QueryValue),操作完成之后,可以关闭子键(CRegKey::Close)。
要想使用CRegKey类,需要包含头文件atlbase.h
2.常用操作方法
1) 打开需要查询或修改的注册表键
LONG Open( HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired = KEY_ALL_ACCESS );
hKeyParent参数指定了待打开的注册表键的句柄,常用的可选值为
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
以上四个值分别代表了注册表中最主要的四个分支;
lpszKeyName参数指定了在hKeyParent下需要打开的项的名字;
samDesired参数指定了打开该项后所拥有的权限,默认为KEY_ALL_ACCESS,表示拥有对该分支的所有操作权,包括读和写等。
举例:
1: CRegKey myKey;
2: if(myKey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows") != ERROR_SUCCESS)
3: {
4: AfxMessageBox("Error open reg key!!");
5: }
2) 查询注册表项中的某个键的键值
LONG QueryValue( DWORD& dwValue, LPCTSTR lpszValueName );
LONG QueryValue( LPTSTR szValue, LPCTSTR lpszValueName, DWORD* pdwCount )
查询键值提供了两种形式,分别用来获取数值类型的值和字符串类型的值。在上面的形式中,第一种用于获取数值类型的值,第二种用于获取字符串类型的值。
lpszValueName参数用来指定键的名称,dwValue和szValue用于保存键值,而pdwCount用来控制获取到的字符串值的长度
举例:
比如,假设要获得windowx系统默认的桌面壁纸的搜索路径,由于这个路径保存在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion这一项的WallPaperDir键内,如下图
所以,可以用以下的代码来实现:
1: CRegKey myKey;
2: if(myKey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion") != ERROR_SUCCESS)
3: AfxMessageBox("Error open reg key!!!");
4: else
5: {
6: char szPath[MAX_PATH];
7: DWORD dwLen = myKey.QueryValue(szPath, "WallPaperDir", MAX_PATH);
8: }
另外,如果我们想查询某个项的默认键值该怎么办呢?只需要将lpszValueName参数写为空字符串就好了。比如现在想看一下.txt类型的文件的关联程序是谁,我们需要首先在HKEY_CLASSES_ROOT下找到.txt项,然后看它的默认键值是多少:
示例代码如下:
1: CRegKey myKey;
2: if(myKey.Open(HKEY_CLASSES_ROOT, ".txt") != ERROR_SUCCESS)
3: AfxMessageBox("Error open key!!!");
4: else
5: {
6: char szFileType[255];
7: DWORD dwLen = myKey.QueryValue(szFileType, "", sizeof(szFileType));
8: }
3) 添加或修改键值
LONG SetValue( DWORD dwValue, LPCTSTR lpszValueName );
LONG SetValue( LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL );
LONG SetValue( HKEY hKeyParent, LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL );
添加键值函数提供了三种形式,前两种分别用来向当前已经打开的这个项中添加DWORD类型的键、字符串类型的键,最后一种形式的函数,可以在某个特定的分支线下的某个特定的项内添加一个键。如果lpszKeyName指定的键不存在,则添加这个键,否则,就是修改已经存在的键的键值。另外需要注意的是,最后一种形式的SetValue函数,如果lpszKeyName所指定的项不存在,则SetValue函数会返回错误,而不会添加一个项。
示例,比如现在要给IE的工具栏设置一个背景图片,可以在HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Toolbar项下面新建一个BackBitmap的字符串键,并制定背景图片的位置,代码如下:
1: CRegKey myKey;
2: if(myKey.Open(HKEY_CURRENT_USER, "Software\\Microsoft\\Internet Explorer\\Toolbar") != ERROR_SUCCESS)
3: AfxMessageBox("error open reg key!!!");
4: else
5: {
6: myKey.SetValue("C:\\WINDOWS\\Web\\Wallpaper\\Bliss.bmp", "BackBitmap");
7: }
这样,IE的背景图片就被设置成了C:\WINDOWS\Web\Wallpaper\Bliss.bmp
4) 删除键值
LONG DeleteValue( LPCTSTR lpszValue );
这个函数比较简单,它会删除lpszValue参数指定的键。
5) 新建项
LONG Create( HKEY hKeyParent, LPCTSTR lpszKeyName, LPTSTR lpszClass = REG_NONE, DWORD dwOptions = REG_OPTION_NON_VOLATILE, REGSAM samDesired = KEY_ALL_ACCESS, LPSECURITY_ATTRIBUTES lpSecAttr = NULL, LPDWORD lpdwDisposition = NULL );
Create函数用于创建一个项,它可以在hKeyParent指定的分支下,创建一个名为lpszKeyName的项,后面几个参数一般用默认的即可。
比如,现在要建立一个新的文件类型.spj的关联方式,首先需要在HKEY_CLASSES_ROOT下建立一个名为.spj的项,代码如下:
1: CRegKey myKey;
2: if(myKey.Create(HKEY_CLASSES_ROOT, ".spj") != ERROR_SUCCESS)
3: AfxMessageBox("error create key!!!");
4: else
5: AfxMessageBox("create key ok!");
6) 删除项
LONG DeleteSubKey( LPCTSTR lpszSubKey );
该函数可以删除名为lpszSubKey的项,以及该项下的所有的键。注意,被删除的项不能含有子项!可以通过另外一个函数LONG RecurseDeleteKey( LPCTSTR lpszKey );删除某个项以及该项下的所有内容。
7) 关闭注册表
LONG Close( );
关闭注册表时,之前所做的修改才会被保存到硬盘。或者,也可以使用LONG RegFlushKey( HKEY hKey ); 函数在需要的时候将所做的修改及时写入硬盘。
OK,有关CRegKey的介绍先告一段落。
分享到:
相关推荐
这里面的代码我都实验过了,都可以用的,我用的是VS2005 如果有什么不明白的地方,欢迎留言,共同讨论
MFC 注册表操作 demo(新增,删除,读取,修改) 代码简单不复杂,适合初学者
注册表是windows操作系统中的一个核心数据库,其中存放着各种参数,直接控制着 windows的启动、硬件驱动程序的装载以及一些windows应用程序的运行,从而在整个系统中起着核心作用.这些作用包括了软、硬件的相关配置和状...
注册表修改程序,主要通过修改注册表来获取、修改操作系统的设置 可以通过它来了解VC对注册表的基本操作,也可以通过它来设置机器信息。
MFC操作注册表 环境VS2005 本例来自网络,原文代码没下载到,自己按照其描述重写了一份,对代码做了少许调整,以适合Unicode编码,适合初学者,内附原文链接
用MFC做的界面程序,实现注册表和INI配置档的读写操作。
注册表操作,教你如何使用注册表
杭州电子科技大学,信息安全程序设计作业。mfc编程 注册表安全设计
MFC访问注册表,可以直接运行的源代码,亲测成功。
操作系统实践大作业,使用MFC实现注册表编辑器程序。环境为vs10
注册表编程。实现对注册表的创建添加删除功能,对于在mfc下对注册表的操作的初步了解
实现一个小型的带界面的程序,实现注册表查询和修改 • 能够返回给定VALUE的内容 • 能够修改给定VALUE的内容 • 能够添加KEY和VALUE • 利用上述程序,实现某Windows程序的开机自动运行(自行查阅资料确定所需修改...
VS2019 MFC 操作系统注册表包括读取写入二进制、读取写入字符串、读取写入数值、删除注册表键值、删除注册表子相等功能
注册表编程\RegAppfunc 利用注册表API函数来查询和修改系统用户信息实例源码 注册表编程\RegWinApp CWinApp类提供的... 注册表编程\MyRegExample 利用自己创建的注册表类CMyRegistry访问、修改注册表实例源码
通过注册表限制软件的使用次数 通过注册表限制软件的使用次数 通过注册表限制软件的使用次数 通过注册表限制软件的使用次数
MFC 中利用Edit控件记录操作日志,具体的使用方法可以看源码。
多个MFC文件操作与注册表编程实例,均可运行
VS使用MFC操作EXCEL,新建编辑保存等操作,VS使用MFC操作EXCEL,新建编辑保存等操作,VS使用MFC操作EXCEL,新建编辑保存等操作
实现一个小型的带界面的程序,实现注册表查询和修改 • 能够返回给定VALUE的内容 • 能够修改给定VALUE的内容 • 能够添加KEY和VALUE
64位的系统下64位注册表路径才能正常使得程序自启动,查看时也要注意32 位 64 位能获取道的注册表可能不一样