实现原理:
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 ", 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 = "目标程序已添加到以下快速启动目录 "; m_Edit_TipMsg += szStartupPath; m_Edit_TipMsg += " "; m_Edit_TipMsg += "可自行查看或删除 "; UpdateData(FALSE);