本文最后更新于485 天前,其中的信息可能已经过时,如有错误请发送邮件到1739584917@qq.com
1.通过改写注册表
首先呢,需要判断你的程序有没有需要依赖的动态库(.dll),如果有,你可以选择将程序依赖的dll复制到系统的system32目录或SysWOW64目录下(一般在C:\Windows下);接着在system32目录下创建关于该程序的软链接。
创建软链接
首先以管理员身份打开命令窗口,输入:
mklink RemoteCtl.exe D:\RemoteCtl.exe
(但有时候很奇怪,明明是在System32目录下创建的,也显示了创建成功,但实际上却创建到了C:\Windows\SysWOW64目录下)
记得去检查一下到底在哪
创建注册表
按win+R打开运行,输入regedit回车确认;
进入目录:
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
右键 新建—可扩充字符串值
名称可以随便写,但是一定不要写中文
右键修改
数值数据就写你前面创建软链接的地址,
%SystemRoot%\System32\RemoteCtrl.exe
或真实地址
C:\Windows\System32\RemoteCtrl.exe
这样就可以了。
代码实现
//先启动一次,确认软链接创建的位置,我的机器上就是创建在了SysWOW64目录下
void WriteRegisterTable()
{
CString Path = CString("C:\\Windows\\SysWOW64\\RemoteCtrl.exe ");//判断软链接是否存在,如果存在直接结束
if (PathFileExists(Path))
{
return;
}
char sPath[MAX_PATH] = "";
char sSys[MAX_PATH] = "";
GetCurrentDirectoryA(MAX_PATH, sPath);//获取程序的当前目录
GetSystemDirectoryA(sSys, sizeof(sSys));//获取系统目录
std::string strCmd = "mklink " + std::string(sSys) + std::string("\\RemoteCtrl.exe ") + std::string(sPath) + std::string("\\RemoteCtl.exe");
//拼接字符串 "mklink RemoteCtl.exe D:\RemoteCtl.exe"
system(strCmd.c_str());//打开命令窗口创建软链接
CString strSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");//计算机默认就是打开HKEY_LOCAL_MACHINE,所有不用加HKEY_LOCAL_MACHINE
HKEY hKey = NULL;
int ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, strSubKey, 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hKey);//打开注册表
if (ret != ERROR_SUCCESS)
{
RegCloseKey(hKey);
MessageBox(NULL, _T("设置自动开机启动失败!\n操作失败 "), _T("错误"), MB_ICONERROR | MB_TOPMOST);
::exit(0);
}
CString strPath = CString("%SystemRoot%\\SysWOW64\\RemoteCtrl.exe ");//写入注册表的数值数据
ret = RegSetValueEx(hKey, _T("RemoteCtrl"), 0, REG_EXPAND_SZ, (BYTE*)(LPCTSTR)strPath, strPath.GetLength() * sizeof(TCHAR));//写注册表
if (ret != ERROR_SUCCESS)
{
RegCloseKey(hKey);
MessageBox(NULL, _T("设置自动开机启动失败!\n操作失败 "), _T("错误"), MB_ICONERROR | MB_TOPMOST);
::exit(0);
}
RegCloseKey(hKey);
}
2.将文件复制到启动目录
win+R 输入:
shell:startup
将exe文件复制到这个文件夹下即可
这个文件夹一般都在C:\Users\xxxx\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
代码实现
void WriteStartupDir(const CString&strPath)
{
char Envir[MAX_PATH] = "USERPROFILE";
char hPath[MAX_PATH] = "";
GetEnvironmentVariableA(Envir, hPath, MAX_PATH);//通过环境变量获取用户目录"C:\Users\xxxx\"
CString strPath = CString(hPath) + CString(_T("\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\RemoteCtrl.exe"));
if (PathFileExists(strPath))
{
return;
}
CString strCmd = GetCommandLine();
strCmd.Replace(_T("\""), _T(""));//去除双引号
BOOL ret = CopyFile(strCmd, strPath, FALSE);//复制文件到startup目录
if (ret==FALSE)
{
MessageBox(NULL, _T("复制文件失败,是否权限不足\r\n"), _T("错误"), MB_TOPMOST | MB_ICONERROR);
::exit(0);
}
}
区别
通过改写注册表的自启动是在用户登录时启动的,而startup目录下的文件是随着系统的启动而相继启动的