在Visual Studio中为程序设置开机启动

最近有一个需求,需要向一个没有可视化界面的终端发送网络指令,但是第一要确保在这个终端中,我们的程序是在运行着的,所以需要让他开机自启动。于是,我开始查资料,找到了Sharon Liu的C++设置程序开机自启动以及qq2669573897的VS2017 C++ 编写一个通过注册表自定义软件开机启动程序这篇文章。
但是这两篇文章都不是很完善,Liu的这篇在应用路径的配置上写的很好,但是他引入了一个dxir::Base的类,就是为了处理字符串,但是感觉没有必要,所以在这里使用了第二篇文章中的TEXT(“AppName”)的方式来处理,用起来会方便一些。下面附上综合后的代码。

int AutoStart()
{       //1、配置并打开注册表 
    //_T宏可以把一个引号引起来的字符串,根你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式
    LPCTSTR lpSubKey = _T("SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
    HKEY hKey;
    REGSAM flag = KEY_WOW64_64KEY;//当前系统为win7 64位,访问的是64位的注册表,如果访问32位,则改为KEY_WOW64_32KEY
    LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_ALL_ACCESS | flag, &hKey);

    if (ERROR_SUCCESS != lRet)
    {
        cout << "RegOpenKeyEx fail!" << endl;
        return -1;
    }
    //2、得到本程序自身的全路径
    TCHAR strExeFullDir[MAX_PATH];
    GetModuleFileName(NULL, strExeFullDir, MAX_PATH);


    //3、判断注册表项是否已经存在
    TCHAR strDir[MAX_PATH] = {};
    DWORD nLength = MAX_PATH;
    long result = RegGetValue(hKey, nullptr, TEXT("AppName"), RRF_RT_REG_SZ, 0, strDir, &nLength);


    //4、不存在
    if (result != ERROR_SUCCESS || _tcscmp(strExeFullDir, strDir) != 0)
    {
        //5、添加一个子Key,并设置值
        lRet = RegSetValueEx(hKey, TEXT("AppName"), 0, REG_SZ, (LPBYTE)strExeFullDir,
            (lstrlen(strExeFullDir) + 1) * sizeof(TCHAR));
    }

    if (ERROR_SUCCESS != lRet)
    {
        cout << "RegSetValueEx fail!" << endl;
        return -1;
    }
        //6、关闭注册表
    RegCloseKey(hKey);
    return 0;
}

在主程序中运行后按住Win+R输入regedit,进入计算机HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun,结果如下图。

在Visual Studio中为程序设置开机启动

—————————————————————————————————————
-The End-

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容