Windows的Run和RunOnce注册表项可以让用户登陆系统时自动启动一些程序。
其中涉及到的注册表项如下:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
在这四种项中添加的自启动程序的规则不一样:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
表示任何账户每一次登陆到Windows系统都会自动启动在这个项下面注册的程序
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
表示任何账户下一次登陆到Windows系统会自动启动在这个项下面注册的程序,以后就不会自启了
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
表示当前账户每一次登陆到Windows系统都会自动启动在这个项下面注册的程序
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
表示当前账户下一次登陆到Windows系统会自动启动在这个项下面注册的程序,以后就不会自启了
一般来说
在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
项下注册自启动项,不使用HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
注册表原因是因为修改该注册表的值需要管理员权限。
API
功能
RegCreateKey
创建一个KEY,并返回相应的HKEY
RegOpenKey
打开注册表,得到一个HKEY,用来作为下面这些函数的第一个参数
RegOpenKeyEx
同RegOpenKey类似,一般很少用,增加了一个访问控制类型参数
RegSetValue
设置一个HKEY的默认值
RegSetValueEx
设置一个HKEY除默认值以外其它的值
RegQueryValue
获取一个HKEY的默认值
RegQueryValueEx
获取一个HKEY除默认值以外其它的值
RegDeleteKey
删除一个KEY,此KEY不能包含子KEY
SHDeleteKey
删除一个KEY以及所有子KEY
RegDeleteValue
删除KEY里面的值
RegCloseKey
关闭注册表
// auto_exection_reg.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <Windows.h>
int main()
{
HKEY hKey;
//const char *filename = "C:\\Users\\Public\\hello.exe";
BYTE value[256] = "C:\\Users\\Public\\hello.exe";
if (ERROR_SUCCESS != ::RegOpenKeyExA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_WRITE, &hKey))
{
MessageBox(0, "error", "error", MB_OK);
}
/*if (ERROR_SUCCESS != RegSetValueEx(hKey, L"hello", 0, REG_SZ, (const byte*)filename, (1 + ::strlen(filename))))
{
MessageBox(0, L"error", L"error", MB_OK);
}*/
if (ERROR_SUCCESS != RegSetValueEx(hKey, "hello", 0, REG_SZ, value, 256))
{
MessageBox(0, "error", "error", MB_OK);
}
RegCloseKey(hKey);
MessageBox(0, "OK", "RegSetValueEx", MB_OK);
// else
// {
// MessageBox(0, L"RegSetValueEx", L"error", MB_OK);
// }
//
//
//}
// else
// {
// MessageBox(0, L"error", L"error", MB_OK);
// return false;
// }
system("pause");
return 0;
}
//LSTATUS RegOpenKeyExA(
// [in] HKEY hKey,
// [in, optional] LPCSTR lpSubKey,
// [in] DWORD ulOptions,
// [in] REGSAM samDesired,
// [out] PHKEY phkResult
//);
重启系统
在实际中可能会遇到注册表重定向问题,HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
写入值后会发现值会被重定向到HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
在RegOpenKeyEx的时候可以将函数设置为KEY_WOW64_64KEY
LONG lReturn = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\***", 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hKey);
#include "stdafx.h"
#include "AutoRun_Reg.h"
void ShowError(char *lpszText)
{
char szErr[MAX_PATH] = { 0 };
::wsprintf(szErr, "%s Error!\nError Code Is:%d\n", lpszText, ::GetLastError());
#ifdef _DEBUG
::MessageBox(NULL, szErr, "ERROR", MB_OK | MB_ICONERROR);
#endif
}
BOOL Reg_CurrentUser(char *lpszFileName, char *lpszValueName)
{
// 默认权限
HKEY hKey;
// 打开注册表键
if (ERROR_SUCCESS != ::RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_WRITE, &hKey))
{
ShowError("RegOpenKeyEx");
return FALSE;
}
// 修改注册表值,实现开机自启
if (ERROR_SUCCESS != ::RegSetValueEx(hKey, lpszValueName, 0, REG_SZ, (BYTE *)lpszFileName, (1 + ::lstrlen(lpszFileName))))
{
::RegCloseKey(hKey);
ShowError("RegSetValueEx");
return FALSE;
}
// 关闭注册表键
::RegCloseKey(hKey);
return TRUE;
}
BOOL Reg_LocalMachine(char *lpszFileName, char *lpszValueName)
{
// 管理员权限
HKEY hKey;
// 打开注册表键
if (ERROR_SUCCESS != ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_WRITE, &hKey))
{
ShowError("RegOpenKeyEx");
return FALSE;
}
// 修改注册表值,实现开机自启
if (ERROR_SUCCESS != ::RegSetValueEx(hKey, lpszValueName, 0, REG_SZ, (BYTE *)lpszFileName, (1 + ::lstrlen(lpszFileName))))
{
::RegCloseKey(hKey);
ShowError("RegSetValueEx");
return FALSE;
}
// 关闭注册表键
::RegCloseKey(hKey);
return TRUE;
}