//是否设置开启开机运行某程序
bool IsEnablePowerOnRunProgram(char *pProgrameName, char *pProgramePathName, unsigned char ucIsCheckSamePathName)
{
if (NULL == pProgramePathName || 0 == strlen(pProgramePathName) || NULL == pProgrameName || 0 == strlen(pProgrameName))
return false;
bool bFind = false;
HKEY hRegKey = NULL;
LONG lRet = RegOpenKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", &hRegKey);
if (lRet == ERROR_SUCCESS && hRegKey != NULL)
{
char szValue[MAX_PATH] = { 0 };
DWORD dwSize = MAX_PATH;
DWORD dwType = REG_SZ;
if (::RegQueryValueEx(hRegKey, pProgrameName, NULL, &dwType, (LPBYTE)szValue, &dwSize) == ERROR_SUCCESS)
{
if (0 == ucIsCheckSamePathName)
{
bFind = true;
}
else
{
if (strcmp(szValue, pProgramePathName) == 0)
{
bFind = true;
}
}
}
else
{
//无法查询有关的注册表信息
bFind = false;
}
RegCloseKey(hRegKey);
}
return bFind;
}
//开启开机运行某程序
bool PowerOnRunProgram(char *pProgrameName, char *pProgramePathName)
{
if (NULL == pProgramePathName || 0 == strlen(pProgramePathName) || NULL == pProgrameName || 0 == strlen(pProgrameName))
return false;
//判断文件是否存在
if (!PathFileExists(pProgramePathName))
{
return true;
}
HKEY hRegKey = NULL;
LONG lRet = RegOpenKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", &hRegKey);
if (lRet == ERROR_SUCCESS && hRegKey != NULL)
{
#ifdef UNICODE
lRet = RegSetValueEx(hRegKey, pProgrameName, 0, REG_SZ, (const BYTE *)pProgramePathName, _tcslen(pProgramePathName)*2);//这里加上你需要在注册表中注册的内容
#else
lRet = RegSetValueEx(hRegKey, pProgrameName, 0, REG_SZ, (const BYTE *)pProgramePathName, _tcslen(pProgramePathName));//这里加上你需要在注册表中注册的内容
#endif
RegCloseKey(hRegKey);
if (lRet == ERROR_SUCCESS)
{
return true;
}
}
return false;
}
//开机不运行某程序
bool PowerOnStopRunProgram(char *pProgrameName, char *pProgramePathName,unsigned char ucIsCheckSamePathName)
{
if (NULL == pProgramePathName || 0 == strlen(pProgramePathName) || NULL == pProgrameName || 0 == strlen(pProgrameName))
return false;
HKEY hRegKey = NULL;
LONG lRet = 0;
lRet = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_QUERY_VALUE | KEY_WRITE, &hRegKey);
if (lRet == ERROR_SUCCESS)
{
bool bIsDeleteFlag = false;
if (ucIsCheckSamePathName == 0)
{
bIsDeleteFlag = true;
}
else
{
char szValue[MAX_PATH] = { 0 };
DWORD dwSize = MAX_PATH;
DWORD dwType = REG_SZ;
if (::RegQueryValueEx(hRegKey, pProgrameName, NULL, &dwType, (LPBYTE)szValue, &dwSize) == ERROR_SUCCESS)
{
if (strcmp(szValue, pProgramePathName) == 0)
{
bIsDeleteFlag = true;
}
}
}
if (bIsDeleteFlag)
{
lRet = RegDeleteValue(hRegKey, pProgrameName);
}
RegCloseKey(hRegKey);
if (lRet == ERROR_SUCCESS)
{
return true;
}
}
return false;
}
操作注册表,实现开机自启动应用程序。通过写HKEY_LOCAL_MACHINE或HKEY_CURRENT_USER中的Sofeware\Microsoft\Windows\CurrentVersion\Run值。
在admin用户登录权限下C++可将值写入注册表 HKEY_LOCAL_MACHINE\Sofeware\Microsoft\Windows\CurrentVersion\Run,在非admin用户登录权限下使用管理员权限只能写入到HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run。实现的效果和admin是一样的。而将值写入注册表 HKEY_LOCAL_MACHINE\Sofeware\Microsoft\Windows\CurrentVersion\Run,无论是管理员权限还是非管理员权限都可以写入成功。
调用方法:
//设置开机运行
if (!IsEnablePowerOnRunProgram(_T("XDemo"), m_szProgramFilePathName, 1))
{
PowerOnRunProgram(_T("XDemo"), m_szProgramFilePathName);
}
//设置开机不运行
PowerOnStopRunProgram(_T("XDemo"), m_szProgramFilePathName, 0);
m_szProgramFilePathName为XDemo程序全路径名称。
//执行注册表操作,需要管理员权限,在vs工程中设置。
项目-》XXX 属性-》配置属性-》链接器-》清单文件
UAC执行级别在VS里面的设置如下:
用户 |
asInvoker |
highestAvailable |
requireAdministrator |
Adminitrator(Adminitrators) |
成功复制,无提示 |
成功复制,无提示 |
成功复制,无提示 |
TestUser(Adminitrators) |
失败复制,无提示 |
成功复制,有提示 |
成功复制,有提示 |
TestUser(Users) |
失败复制,无提示 |
失败复制,无提示 |
提示输入管理员密码 |
1、HKEY_CURRENT_USER
是HKEY_LOCAL_MACHINE\Software的子项。此处存储的信息可以确保当使用Windows 资源管理器打开文件时,将打开正确的程序。即在HKEY_LOCAL_MACHINE\Software\Classes中或者在HKEY_LOCAL_USER\Software\Classes中出现的值,如果该信息同时在两处出现,那么HKEY_LOCAL_USER\Software\Classes拥有优先权。