把事情做到最简单,做到最多人能接受,才是最好的,鉴于最多的人学的是C,所以全部用C写一下对注册表的枚举,更改,删除的操作。
以HKEY_LOCAL_MACHINE\Software\Miscrosoft\Windows\CurrentVision\Run\为例,即实现对开机启动项的枚举和修改
#define REG_RUN "Software\\Miscrosoft\\Windows\\CurrentVision\\Run" //方便以后写先把要打开的键在这儿宏定义,你要改成修改其他的键,直接改这儿就行了
#include
#include
int main(int argc,char *argv[])
{
DWORD dwType=0;
DWORD dwBufferSize=MAXBYTE;
DWORD dwKeySize=MAXBYTE; //这几个东西,直接翻译它的英文意思就懂了是干嘛的了,它们前面的dw表示是dword型数据,占4个字节就和long int 一个样,后面的MAXBYTE在windows.h这个库里定义了,你可以在VC里它选中,然后单击右键选择"Go To定义",VC就会自动打开winbase.h这个页面,然后你就可以在这里看到它对应的值,自己看吧,我就不说了多多动手,这个Winbase.h里面还有很多好东西哦。
char szValueName[MAXBYTE]= {0};
char szValueKey[MAXBYTE]={0}; //定义两个char型数组用于保存要枚举的键名和键值
HKEY hKey=NULL; //定义注册表句柄,不管它这些都是windows相关的东西,只要记主,要打开窗口就要定义一个窗口句柄 HWND,要打开进程就要定义一个 HPROCESS....都是h开头。
LONG lRet =RegOpenKey(HKEY_LOCAL_MACHINE,REG_RUN,&hKey) //用RegOpenKey函数打开你要修改的的键保存到hKey句柄,该函数返回一个LONG类型的数据,用以判断是否打开成功。
if(lRet!=ERROR_SUCCES) //如果没打开成功,则退出
{
return;
}
int i=0;
While(0) //进入枚举循环
{
lRet=RegEnumValue(hKey,i,szValueName,&dwBufferSize,NULL,&dwType,(unsigned char *)szValueKey,&dwKeySize); //按循序用RegEnumValue函数枚举该键下的键名保存到szValueName下,键值保存到szValueKey下,该函数同样返回一个判断性的LONG.
if( lRet==ERROR_NO_MORE_ITEMS) //判断枚举是否结束,结束则退出循环
{
break;
}
printf("%d 键名为: %s 键值为: %s \r\n" ,i,szValueName,szValueKey);
i++;
ZeroMemory(szValueName,MAXBYTE);
ZeroMemory(szValueKey,MAXBYTE); //清除szValueName里的数据方便下次读入
}
//下面是实现添加键,以添加REG_SZ类型键为例,其他类型也一样,只是把类型改一下,把前面的char型数组改一下
printf("请输入您要填加的键名");
scanf("%s",szValueName);
printf("请输入键值");
scanf("%s",szValueKey);
RegSetValueEX(hKey,szValueName,NULL,REG_SZ,(const unsigned char*)szValueKey,strlen(KeyValue)+sizeof(char)); //添加你输入的键值和键名;
.....//你可以在这儿加入代码让它再枚举一下,看是否加入成功了;
//删除刚刚加入的键
RegDeleteValue(hKey,szKeyName);
RegCloseKey(hKey) //打开的东西一定要记得关,养成好习惯
}
注:要实验的话,最好关闭杀软,杀软会有提示,然后阻止你的RegSetValueEx这个函数的写入。