0 概述
軟件開機自啟動是比較常用的做法,設置方法也有好幾種。
1 使用者模式
在“開始菜單”的所有程序中有個“啟動”文件夾,可以將需要設置為開機啟動的應用程序放在這個文件夾中。但是,這樣做存在不足:“啟動”文件夾路徑在每台電腦有可能是不同的,沒法做到一勞永逸。

同時,如果要禁止程序開機啟動,可將“啟動”文件夾中對應的程序文件移除,也可以“Win+R”輸入“msconfig”進行手動設置:

2 開發者模式
作為開發人員,當然寫注冊表是最好的方法:
1、 新建一個基於對話框的MFC應用程序AutoRun;
2、 添加一個Check Box,ID設置為IDC_CHECK_AUTORUN,文本“開機自啟動~”;
3、 在AutoRunDlg.h中添加私有成員變量:int m_nCheakState;
4、 在AutoRunDlg.cpp開始加入代碼:
inline void SetAutoRun() { TCHAR szFilePath[MAX_PATH]; memset(szFilePath, 0, MAX_PATH); if (GetModuleFileName(NULL, szFilePath, MAX_PATH)) { HKEY hKey; CString strRegPath = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, strRegPath, 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS) { RegSetValueEx(hKey, _T("AutoRun"), 0, REG_SZ, (LPBYTE)szFilePath, (lstrlen(szFilePath) + 1)*sizeof(TCHAR)); } RegCloseKey(hKey); } } inline void ReSetAutoRun() { HKEY hKey; CString strRegPath = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, strRegPath, 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS) { RegDeleteValue(hKey, _T("AutoRun")); } RegCloseKey(hKey); }
5、 雙擊OK按鈕,寫入代碼:
CString strFilePath; TCHAR szFilePath[MAX_PATH]; memset(szFilePath, 0, MAX_PATH); if (GetModuleFileName(NULL, szFilePath, MAX_PATH)) { strFilePath = szFilePath; strFilePath = strFilePath.Left(strFilePath.ReverseFind('\\')); strFilePath += _T("\\AutoRun.ini"); } CButton* pBtn = (CButton*)GetDlgItem(IDC_CHECK_AUTORUN); int nCheakState = pBtn->GetCheck(); if (m_nCheakState != nCheakState) { if(nCheakState == BST_UNCHECKED) { ReSetAutoRun(); WritePrivateProfileString(_T("AutoRun"), _T("AutoRun"), _T("0"), strFilePath); } else { SetAutoRun(); WritePrivateProfileString(_T("AutoRun"), _T("AutoRun"), _T("1"), strFilePath); } }
6、 編譯運行:

PS:
1、 設置開機自啟動后,我未能在SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run下找到我設置的注冊表鍵值,重新啟動后生效了~
2、 Debug目錄下生成的文件,任務欄右擊顯示“TOD<文件說明>”

版本信息中FileDescription已做過更改,但是不起作用,很納悶~
將Debug文件夾中的文件移動到其它目錄,顯示正確
編譯的Release文件夾中的文件也顯示正確
