這屬**平台專用 API 程式設計**,非 C 標準庫功能。C 語言透過 Windows API (`RegOpenKeyEx`/`RegSetValueEx`/`RegCloseKey`) 或直接啟動 `reg.exe` / 寫 `.reg` 檔匯入實現。
#define WIN32_LEAN_AND_MEAN
#include
#include
bool add_to_startup(const char* app_name, const char* exe_path) {
HKEY hKey;
LONG res = RegOpenKeyExA(HKEY_CURRENT_USER,
"Software\\Microsoft\\Windows\\CurrentVersion\\Run",
0, KEY_SET_VALUE, &hKey);
if (res != ERROR_SUCCESS) {
fprintf(stderr, "RegOpenKeyEx failed: %ld\n", res);
return false;
}
res = RegSetValueExA(hKey, app_name, 0, REG_SZ,
(const BYTE*)exe_path, (DWORD)(strlen(exe_path) + 1));
RegCloseKey(hKey);
if (res != ERROR_SUCCESS) {
fprintf(stderr, "RegSetValueEx failed: %ld\n", res);
return false;
}
return true;
}
int main(void) {
// 範例:將自身加入開機自啟
char path[MAX_PATH];
GetModuleFileNameA(NULL, path, MAX_PATH);
if (add_to_startup("MyApp", path)) {
puts("已加入開機自啟 (HKCU\\Run)");
}
return 0;
}
// C 代碼中呼叫
system("reg add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\" "
"/v MyApp /t REG_SZ /d \"\\\"C:\\Program Files\\MyApp\\app.exe\\\"\" /f");
或批次檔 `.bat`:
```bat
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v MyApp /t REG_SZ /d "\"C:\Program Files\MyApp\app.exe\"" /f
```
// API
RegDeleteKeyValueA(HKEY_CURRENT_USER,
"Software\\Microsoft\\Windows\\CurrentVersion\\Run", "MyApp");
// 命令列
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v MyApp /f
| 位置 | 範圍 | 啟動時機 |
|---|---|---|
| `HKCU\...\Run` / `HKLM\...\Run` | 使用者/機器 | 使用者登入桌面後 |
| `HKCU\...\RunOnce` / `HKLM\...\RunOnce` | 使用者/機器 | 登入後**僅執行一次**,執行完自動刪除 |
| 啟動資料夾 (`shell:startup` / `shell:common startup`) | 使用者/所有使用者 | 登入後 (捷徑方式) |
| 服務 (`sc create` / `CreateService`) | 系統 | 開機早期 (SESSION 0),無 UI,需服務框架 |
| 任務排程器 (`schtasks` / `ITaskScheduler`) | 系統/使用者 | 觸發條件靈活 (開機/登入/閒置/事件/定時) |
| WMI 事件訂閱 / `HKLM\...\Winlogon\Userinit` / `AppInit_DLLs` / 驅動程式 | 系統 | 極早期/特定場景,**高風險、易被殺毒攔截,非必要勿用** |
C 語言實現開機自啟 = **呼叫 Windows 註冊表 API (`RegSetValueEx`)**。掌握 `HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run` 寫入/刪除/查詢,配合簽名、使用者同意、卸載清理,即為專業級實現。