Windows程序开机自启动的方法
本文最后更新于224 天前,其中的信息可能已经过时,如有错误请发送邮件到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目录下的文件是随着系统的启动而相继启动的

如果觉得本文对您有所帮助,可以支持下博主,一分也是缘
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
/* */