通过快速启动目录设置程序为开机启动

实现原理:

  windows系统有自带的快速启动文件夹,只要把程序(一般是程序快捷方式)放入到这个快速启动文件夹中,系统在启动时就会自动地加载并运行相应的程序,实现开机自启动功能。

  注意:快速启动目录并不是一个固定的目录,每台计算机的快速启动目录都不相同。需要使用 SHGetSpecialFolderPath 函数获取Windows系统中快速启动目录的路径,快速启动目录的CSIDL标识值为CSIDL_STARTUP。

实现过程:

  (1).获取快速启动目录的路径(使用 SHGetSpecialFolderPath)

  (2).创建程序的快捷方式到快速启动目录的路径下

实现代码:

BOOL bRet = FALSE;
    char szStartupPath[MAX_PATH] = { 0 };
    char szDestFilePath[MAX_PATH] = { 0 };
    USES_CONVERSION;
    char* pszFilePath = T2A(m_Edit_FilePath);

    // 获取快速启动目录的路径
    bRet = SHGetSpecialFolderPathA(NULL, szStartupPath, CSIDL_STARTUP, TRUE);
    printf("szStartupPath=%s\n", szStartupPath);
    if (FALSE == bRet)
    {
        m_Edit_TipMsg = "获取快速启动目录的路径失败!";
        UpdateData(FALSE);
        return;
    }

    //创建快捷方式
    //初始化供调用线程使用的COM库,设置线程的并发模型,并在需要时为该线程创建一个新的单元
    HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    if (SUCCEEDED(hr))
    {
        IShellLink *pisl;
        hr = CoCreateInstance(CLSID_ShellLink, NULL,
            CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pisl);
        if (SUCCEEDED(hr))
        {
            IPersistFile* pIPF;

            //这里是我们要创建快捷方式的原始文件地址
            pisl->SetPath(m_Edit_FilePath);
            hr = pisl->QueryInterface(IID_IPersistFile, (void**)&pIPF);
            if (SUCCEEDED(hr))
            {
                //获取文件名
                PathStripPathA(pszFilePath);
                //拼接路径
                wsprintfA(szDestFilePath, "%s\\%s", szStartupPath, pszFilePath);
                //注意路径后缀名要从exe改为lnk
                int nLen = strlen(szDestFilePath);
                szDestFilePath[nLen - 3] = 'l';
                szDestFilePath[nLen - 2] = 'n';
                szDestFilePath[nLen - 1] = 'k';
                WCHAR* szwDestFilePath = A2W(szDestFilePath);
                //这里是我们要创建快捷方式的目标地址
                pIPF->Save(szwDestFilePath, FALSE);
                //减少COM对象上接口的引用计数
                pIPF->Release();
            }
            //减少COM对象上接口的引用计数
            pisl->Release();
        }
        //关闭当前线程上的COM库,卸载该线程加载的所有DLL
        CoUninitialize();
        m_Edit_TipMsg = "目标程序已添加到以下快速启动目录\r\n";
        m_Edit_TipMsg += szStartupPath;
        m_Edit_TipMsg += "\r\n";
        m_Edit_TipMsg += "可自行查看或删除\r\n";
        UpdateData(FALSE);

 

posted @ 2020-04-07 21:28  自己的小白  阅读(508)  评论(0编辑  收藏  举报