原理:
windows 开机会检索注册表,其中有一项
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
是微软 定义的开机程序检索表
利用windows api 函数修改该注册表即可实现开机启动程序
我们手动实现一下:
1、点击开始——运行,输入regedit打开注册表
2、找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
打开后,
点右键 新建-字符串值,输入任意名称,然后右击该名称-修改,
在“数值数据”栏输入你要自动启动的应用程序文件所在的完整路径的文件名
活不多说,开码
需要以下头文件
#include
#include
直接上函数
void HKRunator(char *programName) //程序名称(**全路径**)
{
HKEY hkey = NULL;
DWORD rc;
rc = RegCreateKeyEx(HKEY_LOCAL_MACHINE, //创建一个注册表项,如果有则打开该注册表项
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_WOW64_64KEY | KEY_ALL_ACCESS, //部分windows系统编译该行会报错, 删掉 “”KEY_WOW64_64KEY | “” 即可
NULL,
&hkey,
NULL);
if (rc == ERROR_SUCCESS)
{
rc = RegSetValueEx(hkey,
"UStealer",
0,
REG_SZ,
(const BYTE *)programName,
strlen(programName));
if (rc == ERROR_SUCCESS)
{
RegCloseKey(hkey);
}
}
}
如需调用该函数,传入程序全路径名即可。
一、当前用户专有的启动文件夹
这是许多应用软件自动启动的常用位置,Windows自动启动放入该文件夹的所有快捷方式。用户启动文件夹一般在:\Documents and Settings\<用户名字>\「开始」菜单\程序\启动,其中“<用户名字>”是当前登录的用户帐户名称。
二、对所有用户有效的启动文件夹
这是寻找自动启动程序的第二个重要位置,不管用户用什么身份登录系统,放入该文件夹的快捷方式总是自动启动——这是它与用户专有的启动文件夹的区别所在。该文件夹一般在:\Documents and Settings\All Users\「开始」菜单\程序\启动。
三、Load注册键
介绍该注册键的资料不多,实际上它也能够自动启动程序。位置:HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows\load。
四、Userinit注册键
位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\Userinit。这里也能够使系统启动时自动初始化程序。通常该注册键下面有一个userinit.exe,如图,但这个键允许指定用逗号分隔的多个程序,例如“userinit.exe,OSA.exe”(不含引号)。
五、Explorer\Run注册键
和load、Userinit不同,Explorer\Run键在HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE下都有,具体位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run。
六、RunServicesOnce注册键
RunServicesOnce注册键用来启动服务程序,启动时间在用户登录之前,而且先于其他通过注册键启动的程序。RunServicesOnce注册键的位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServicesOnce。
七、RunServices注册键
RunServices注册键指定的程序紧接RunServicesOnce指定的程序之后运行,但两者都在用户登录之前。RunServices的位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices。
八、RunOnce\Setup注册键
RunOnce\Setup指定了用户登录之后运行的程序,它的位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce\Setup。
九、RunOnce注册键
安装程序通常用RunOnce键自动运行程序,它的位置在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce和HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce。HKEY_LOCAL_MACHINE下面的RunOnce键会在用户登录之后立即运行程序,运行时机在其他Run键指定的程序之前。HKEY_CURRENT_USER下面的RunOnce键在操作系统处理其他Run键以及“启动”文件夹的内容之后运行。如果是XP,你还需要检查一下HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx。
十、Run注册键
Run是自动运行程序最常用的注册键,位置在:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run。HKEY_CURRENT_USER下面的Run键紧接HKEY_LOCAL_MACHINE下面的Run键运行,但两者都在处理“启动”文件夹之前。
可以使用以下 C++ 代码来实现将编译后的可执行文件复制到开机启动项的功能:
#include
#include
#include
int main() {
// 获取当前可执行文件的路径
char currentPath[MAX_PATH];
GetModuleFileName(NULL, currentPath, MAX_PATH);
// 获取启动项目录的路径
char startupPath[MAX_PATH];
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_STARTUP, NULL, 0, startupPath))) {
// 构建目标文件路径
char destinationPath[MAX_PATH];
strcat_s(destinationPath, startupPath);
strcat_s(destinationPath, "\\");
strcat_s(destinationPath, "MyProgram.exe");
// 复制文件
std::ifstream src(currentPath, std::ios::binary);
std::ofstream dest(destinationPath, std::ios::binary);
dest << src.rdbuf();
}
return 0;
}
该程序使用了 Windows 系统的 API 函数来获取当前可执行文件的路径和启动项目录的路径,并将两个路径拼接起来,构成目标文件的路径。然后,使用文件流进行文件复制操作,将当前可执行文件复制到目标文件路径中。
请注意,这段代码假设你的目标文件名为 “MyProgram.exe”,你可以根据需要修改目标文件名和路径。另外,确保以管理员权限运行该程序,以便在启动项目录写入文件。