对于需要管理员身份运行的程序实现开机自启
需要访问注册表HKEY_LOCAL_MACHINE,需要获取UAC权限,用管理员身份运行该程序
对于VS2005,应该以管理员身份运行,调试的程序才可以设置开机启动注册表项目
注册表打开权限:KEY_ALL_ACCESS
对于64位系统,打开注册表的权限应该加上KEY_WOW64_64KEY,否则注册表中不会显示相关项
HKEY hKeyRun;
//LPCTSTR lpRun = L"SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Run";32位程序访问的位置
LPCTSTR lpRun = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";//64位程序访问的位置
//打开启动项Key
long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_ALL_ACCESS|KEY_WOW64_64KEY, &hKeyRun);
if(lRet == ERROR_SUCCESS)
{
TCHAR pFileName[MAX_PATH] = {0};
//得到程序自身的全路径
DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH);
//添加一个子Key,并设置值
lRet = RegSetValueEx(hKeyRun, L"ProgramName", 0, REG_SZ, (BYTE *)pFileName, MAX_PATH);
if(ERROR_SUCCESS != lRet){
MessageBox(L"开机自启设置失败");
}
//关闭注册表
RegCloseKey(hKeyRun);
}
对于不需要管理员权限运行的工具,访问注册表HKEY_CURRENT_USER,以普通身份运行程序
HKEY hKeyRun;
LPCTSTR lpRun = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
//打开启动项Key
long lRet = RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_WRITE, &hKeyRun);
if(lRet == ERROR_SUCCESS)
{
TCHAR pFileName[MAX_PATH] = {0};
//得到程序自身的全路径
DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH);
//添加一个子Key,并设置值
lRet = RegSetValueEx(hKeyRun, L"ProgramName", 0, REG_SZ, (BYTE *)pFileName, MAX_PATH);
if(ERROR_SUCCESS != lRet){
MessageBox(L"开机自启设置失败");
}
//关闭注册表
RegCloseKey(hKeyRun);
}
对于windows10,但凡我设置的注册表键的名字和我的程序名字相同,就会被设置禁止启动,在任务管理器中,启动,将它启用即可

需要用户登录进行自启的方法
一、当前用户专有的启动文件夹
这是许多应用软件自动启动的常用位置,Windows自动启动放入该文件夹的所有快捷方式。用户启动文件夹一般在:\Documents and Settings<用户名字>\「开始」菜单\程序\启动,其中“<用户名字>”是当前登录 的用户帐户名称。
二、对所有用户有效的启动文件夹
这是寻找自动启动程序的第二个重要位置,不管用户用什么身份登录系统,放入该文件夹的快捷方式总是自动启动——这是它与用户专有的启动文件夹的区别所在。 该文件夹一般在:\Documents and Settings\All Users\「开始」菜单\程序\启动。