首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言實現開機自動運行:Windows 註冊表 Run 鍵值寫入指南

     編輯:C 語言問答

核心原理:Windows 登入時自動執行 `HKCU\...\Run` / `HKLM\...\Run` 下的字串值指向的程式

這屬**平台專用 API 程式設計**,非 C 標準庫功能。C 語言透過 Windows API (`RegOpenKeyEx`/`RegSetValueEx`/`RegCloseKey`) 或直接啟動 `reg.exe` / 寫 `.reg` 檔匯入實現。

方案 1:標準 C + Windows API (推薦,無相依、可嵌入安裝程式)

#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;
}
  • 需連結 `Advapi32.lib` (MinGW `-ladvapi32`,MSVC 自動)。
  • `HKEY_CURRENT_USER` → 僅當前使用者;`HKEY_LOCAL_MACHINE` → 所有使用者 (需管理員權限)。
  • 字串值名稱 (`app_name`) 建議唯一 (含公司/產品名),避免衝突。
  • 路徑含空格時**必須加雙引號**:`"C:\\Program Files\\MyApp\\app.exe"`。

方案 2:命令列工具 `reg.exe` (簡單、適合腳本/安裝包)

// 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 ```

方案 3:`.reg` 檔案匯入 (適合大量部署)

```reg Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run] "MyApp"="\"C:\\Program Files\\MyApp\\app.exe\"" ``` 雙擊或 `reg import startup.reg` 套用。

取消開機自啟

// 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` / 驅動程式系統極早期/特定場景,**高風險、易被殺毒攔截,非必要勿用**

安全與合規提醒

  • **簽名你的執行檔** (EV 代碼簽名證書) — 避免 SmartScreen/Defender 攔截、建立信譽。
  • **提供使用者明確選擇** — 安裝時勾選「開機自啟」,預設**不勾選**,尊重使用者自主權。
  • **提供卸載/設定介面移除** — 不要讓使用者在註冊表裡手動刪除。
  • **惡意軟體特徵** — 無簽名、隱藏路徑、隨機名稱、寫 `HKLM` 無提權、修改 `Winlogon`/`AppInit_DLLs` — **你的正規軟體不要像惡意軟體**。

總結

C 語言實現開機自啟 = **呼叫 Windows 註冊表 API (`RegSetValueEx`)**。掌握 `HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run` 寫入/刪除/查詢,配合簽名、使用者同意、卸載清理,即為專業級實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved