c++ 写注册表方式让程序开机自启动
打开注册表:win+R,输入regedit点击确定
你会看到五个根目录,开机自启动的信息写在HKEY_LOCAL_MACHINE下面,具体的目录为SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run
要怎么将开机自启动的信息写入注册表中呢?其实过程很简单,第一步,打开注册表,第二步,写注册表,第三步,关闭键的句柄
打开注册表要使用RegOpenKeyEx函数
LONGRegOpenKeyEx( HKEYhKey,//需要打开的主键的名称 LPCTSTRlpSubKey,//需要打开的子键的名称 DWORDulOptions,//保留,设为0 REGSAMsamDesired,//安全访问标记,也就是权限 PHKEYphkResult//得到的将要打开键的句柄 )
第一个参数,我们要传入
HKEY_LOCAL_MACHINE
第二个参数,我们要传入
SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run
第三个参数,我们要传入
0
第四个参数,稍微有点调皮,很多实例都传入KEY_ALL_ACCESS,但是在64位操作系统下,最好传入KEY_ALL_ACCESS|KEY_WOW64_64KEY,不然写完注册表后,不会显示写入的注册信息
第五个参数,传入一个HKEY的引用即可
写注册表使用RegSetValueEx
函数
LONGRegSetValueEx( HKEYhKey,//RegOpenKeyEx函数中传入的最后一个参数,也就是打开的键的句柄 LPCTSTRlpValueName,//键的名称 DWORDReserved,//传入NULL DWORDdwType,//传入REG_SZ CONSTBYTE*lpData,//要启动的程序的完整地址 DWORDcbData//lpData的大小 );
贴上代码,win8系统下vs2012
voidtest() { LPCTSTRlpSubKey=L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"; HKEYhKey; REGSAMflag=KEY_WOW64_64KEY; DWORDdwDisposition=REG_OPENED_EXISTING_KEY; LONGlRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_ALL_ACCESS|flag,&hKey); //LONGlRet=::RegCreateKeyEx(HKEY_LOCAL_MACHINE,lpSubKey,NULL,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,&dwDisposition); if(ERROR_SUCCESS!=lRet) { return; } TCHAR*pchrName=L"D:\\ProgramFiles(x86)\\Tencent\\QQ\\Bin\\QQ.exe"; lRet=::RegSetValueEx(hKey,TEXT("TEST"),NULL,REG_SZ,(LPBYTE)pchrName,wcslen(pchrName)*sizeof(TCHAR)+1);//设置注册表项 if(ERROR_SUCCESS!=lRet) { return; } ::RegCloseKey(hKey);//与RegCreateKeyEx配对写 };
还有一点要说明,在win8系统下,需要获得管理员权限才能正确运行上述代码,否则,无法打开注册表
具体方法如下:
VS2012,在项目属性-配置属性-链接器-清单文件-UAC执行级别
中设为requireAdministrator(/level='requireAdministrator')
以管理员身份重新运行VS2012