????????
目錄
一、注冊表位置
系統范圍的開機自啟動程序
當前用戶的開機自啟動程序
二、配置步驟
三、注意事項
四、其他方法
任務計劃程序
啟動文件夾
1. 創建程序快捷方式
2. 打開 Startup 文件夾
3. 將快捷方式移動到 Startup 文件夾
4. 驗證程序是否自動啟動
注意事項
?五、開機自啟動程序配置示例代碼
????????在Windows操作系統中,注冊表是一個關鍵的數據庫,它存儲了系統和應用程序的設置和選項。設置開機自啟動程序通常涉及到對注冊表的修改。以下是一些關鍵點和注意事項。
一、注冊表位置
系統范圍的開機自啟動程序
????????路徑:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
此路徑下的所有鍵值對都指向將在系統啟動時運行的程序。這個位置適用于所有用戶。
當前用戶的開機自啟動程序
- 路徑:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
- 這個路徑下的鍵值對僅適用于當前登錄的用戶。
二、配置步驟
-
打開注冊表編輯器
- 按下
Win + R
,輸入regedit
,按回車。
- 按下
-
導航到目標路徑
- 根據需要選擇
HKEY_LOCAL_MACHINE
或HKEY_CURRENT_USER
,然后導航到Software\Microsoft\Windows\CurrentVersion\Run
。
- 根據需要選擇
-
添加新的字符串值
- 右鍵點擊右側窗口,選擇
新建
->字符串值
。 - 給這個新建的值命名,可以是你要添加的程序的名字。
- 右鍵點擊右側窗口,選擇
-
設置值的數據
- 雙擊新建的字符串值,在“數值數據”字段中輸入程序的完整路徑。比如
C:\Program Files\YourProgram\YourProgram.exe
。
- 雙擊新建的字符串值,在“數值數據”字段中輸入程序的完整路徑。比如
三、注意事項
-
路徑和文件名
- 確保輸入的路徑和文件名是正確的,否則程序將無法啟動。
-
權限
- 在修改
HKEY_LOCAL_MACHINE
時,通常需要管理員權限。確保你有合適的權限來進行這些操作。
- 在修改
-
安全性
- 不要隨便添加不明來源的程序到開機自啟動列表,避免惡意軟件在系統啟動時運行。
-
性能
- 太多的開機自啟動程序可能會延長系統啟動時間。盡量只添加必要的程序。
四、其他方法
????????除了使用注冊表,還可以通過以下方法配置開機自啟動程序:
任務計劃程序
????????使用Windows自帶的任務計劃程序,可以創建在登錄時啟動的任務。
????????按下 Win + R
,輸入 taskschd.msc
,按回車。
schtasks /create /tn "MyProgramStartup" /tr "C:\Path\To\YourProgram.exe" /sc onlogon /rl highest
?????????windows C++ 注冊登錄計劃任務,用于在Windows中使用Task Scheduler COM接口創建一個在用戶登錄時啟動的計劃任務:
#include <iostream>
#include <comdef.h>
#include <taskschd.h>
#pragma comment(lib, "taskschd.lib")
#pragma comment(lib, "comsupp.lib")void CreateTaskSchedulerTask() {// 初始化COM庫,以支持多線程HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);if (FAILED(hr)) {std::cerr << "CoInitializeEx failed: " << hr << std::endl;return;}// 設置COM安全級別hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, 0, NULL);if (FAILED(hr)) {std::cerr << "CoInitializeSecurity failed: " << hr << std::endl;CoUninitialize();return;}// 創建Task Service實例ITaskService* pService = NULL;hr = CoCreateInstance(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskService, (void**)&pService);if (FAILED(hr)) {std::cerr << "CoCreateInstance failed: " << hr << std::endl;CoUninitialize();return;}// 連接到Task Servicehr = pService->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t());if (FAILED(hr)) {std::cerr << "ITaskService::Connect failed: " << hr << std::endl;pService->Release();CoUninitialize();return;}// 獲取根任務文件夾ITaskFolder* pRootFolder = NULL;hr = pService->GetFolder(_bstr_t(L"\\"), &pRootFolder);if (FAILED(hr)) {std::cerr << "Cannot get Root Folder pointer: " << hr << std::endl;pService->Release();CoUninitialize();return;}// 創建任務定義ITaskDefinition* pTask = NULL;hr = pService->NewTask(0, &pTask);pService->Release(); // 釋放服務指針,因為它不再需要if (FAILED(hr)) {std::cerr << "Failed to create task definition: " << hr << std::endl;pRootFolder->Release();CoUninitialize();return;}// 獲取任務的注冊信息接口,用于設置任務的標識IRegistrationInfo* pRegInfo = NULL;hr = pTask->get_RegistrationInfo(&pRegInfo);if (FAILED(hr)) {std::cerr << "Cannot get identification pointer: " << hr << std::endl;pRootFolder->Release();pTask->Release();CoUninitialize();return;}pRegInfo->put_Author(L"Author Name"); // 設置任務的作者信息pRegInfo->Release();// 獲取觸發器集合ITriggerCollection* pTriggerCollection = NULL;hr = pTask->get_Triggers(&pTriggerCollection);if (FAILED(hr)) {std::cerr << "Cannot get trigger collection: " << hr << std::endl;pRootFolder->Release();pTask->Release();CoUninitialize();return;}// 創建登錄觸發器ITrigger* pTrigger = NULL;hr = pTriggerCollection->Create(TASK_TRIGGER_LOGON, &pTrigger);pTriggerCollection->Release();if (FAILED(hr)) {std::cerr << "Cannot create trigger: " << hr << std::endl;pRootFolder->Release();pTask->Release();CoUninitialize();return;}// 獲取ILogonTrigger接口ILogonTrigger* pLogonTrigger = NULL;hr = pTrigger->QueryInterface(IID_ILogonTrigger, (void**)&pLogonTrigger);pTrigger->Release();if (FAILED(hr)) {std::cerr << "QueryInterface call failed for ILogonTrigger: " << hr << std::endl;pRootFolder->Release();pTask->Release();CoUninitialize();return;}pLogonTrigger->put_Id(_bstr_t(L"Trigger1")); // 設置觸發器IDpLogonTrigger->Release();// 獲取操作集合IActionCollection* pActionCollection = NULL;hr = pTask->get_Actions(&pActionCollection);if (FAILED(hr)) {std::cerr << "Cannot get action collection: " << hr << std::endl;pRootFolder->Release();pTask->Release();CoUninitialize();return;}// 創建執行操作IAction* pAction = NULL;hr = pActionCollection->Create(TASK_ACTION_EXEC, &pAction);pActionCollection->Release();if (FAILED(hr)) {std::cerr << "Cannot create action: " << hr << std::endl;pRootFolder->Release();pTask->Release();CoUninitialize();return;}// 獲取IExecAction接口IExecAction* pExecAction = NULL;hr = pAction->QueryInterface(IID_IExecAction, (void**)&pExecAction);pAction->Release();if (FAILED(hr)) {std::cerr << "QueryInterface call failed for IExecAction: " << hr << std::endl;pRootFolder->Release();pTask->Release();CoUninitialize();return;}// 設置要執行的程序路徑pExecAction->put_Path(_bstr_t(L"C:\\Path\\To\\YourProgram.exe"));pExecAction->Release();// 注冊任務IRegisteredTask* pRegisteredTask = NULL;hr = pRootFolder->RegisterTaskDefinition(_bstr_t(L"MyProgramStartup"),pTask,TASK_CREATE_OR_UPDATE,_variant_t(L""),_variant_t(L""),TASK_LOGON_INTERACTIVE_TOKEN,_variant_t(L""),&pRegisteredTask);if (FAILED(hr)) {std::cerr << "Error saving the Task : " << hr << std::endl;pRootFolder->Release();pTask->Release();CoUninitialize();return;}std::cout << "Task successfully registered." << std::endl;pRootFolder->Release();pTask->Release();pRegisteredTask->Release();CoUninitialize();
}int main() {CreateTaskSchedulerTask();return 0;
}
XML配置計劃任務:
啟動文件夾
????????將程序快捷方式放置在 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
文件夾中。
將程序快捷方式放置在 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
文件夾中,您可以確保該程序在每次啟動 Windows 時自動運行。以下是詳細的步驟:
1. 創建程序快捷方式
如果您已經有程序的快捷方式,請跳過此步驟。
- 找到您希望自動啟動的程序的可執行文件(通常以
.exe
結尾)。 - 右鍵單擊該文件并選擇“創建快捷方式”。這將在同一文件夾中創建一個快捷方式文件。
2. 打開 Startup 文件夾
- 按
Win + R
鍵以打開“運行”對話框。 - 輸入
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
并按 Enter 鍵。這將打開 Startup 文件夾。
3. 將快捷方式移動到 Startup 文件夾
- 找到您創建的程序快捷方式。
- 右鍵單擊該快捷方式并選擇“剪切”。
- 打開 Startup 文件夾后,在空白區域右鍵單擊并選擇“粘貼”。這樣,快捷方式就會被移動到 Startup 文件夾中。
4. 驗證程序是否自動啟動
- 重啟您的計算機。
- 在 Windows 啟動后,確認您所放置在 Startup 文件夾中的程序是否自動運行。
注意事項
- 確保您有管理員權限來執行這些操作,特別是訪問和修改
C:\ProgramData
文件夾時。 - 如果某些程序不適合自動啟動或會導致系統性能問題,請謹慎添加到 Startup 文件夾中。
通過上述步驟,您可以輕松地將任何程序設置為開機自動啟動。
?五、開機自啟動程序配置示例代碼
#include <windows.h>
#include <iostream>bool AddToStartup(const wchar_t* appName, const wchar_t* appPath, const wchar_t* appArgs) {HKEY hKey;LONG lResult;const wchar_t* runKeyPath = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";// 創建包含程序路徑和參數的完整命令行std::wstring command = L"\"";command += appPath;command += L"\" ";command += appArgs;// 打開注冊表項lResult = RegOpenKeyEx(HKEY_CURRENT_USER, runKeyPath, 0, KEY_WRITE, &hKey);if (lResult != ERROR_SUCCESS) {std::wcerr << L"Failed to open registry key: " << lResult << std::endl;return false;}// 設置注冊表值lResult = RegSetValueEx(hKey, appName, 0, REG_SZ, (const BYTE*)command.c_str(), (command.size() + 1) * sizeof(wchar_t));if (lResult != ERROR_SUCCESS) {std::wcerr << L"Failed to set registry value: " << lResult << std::endl;RegCloseKey(hKey);return false;}// 關閉注冊表項RegCloseKey(hKey);return true;
}int main() {const wchar_t* appName = L"MyApp";const wchar_t* appPath = L"C:\\Path\\To\\YourApp.exe";const wchar_t* appArgs = L"--example-arg";if (AddToStartup(appName, appPath, appArgs)) {std::wcout << L"Successfully added to startup." << std::endl;} else {std::wcerr << L"Failed to add to startup." << std::endl;}return 0;
}