許多桌面應用程式需要在 Windows 開機時自動啟動。本文詳細說明如何透過登錄機制實現開機自啟動的啟用與停用,提供可直接套用的完整程式碼與最佳實務建議。
Windows 透過登錄機碼 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 控制開機自動執行的程式。寫入鍵值即啟用,刪除鍵值即停用。
using Microsoft.Win32;
///
/// 設定或取消開機自動啟動
///
/// true=啟用, false=停用
/// 應用程式名稱(登錄鍵名)
/// 執行檔完整路徑
public static void SetAutoRun(bool startEnabled, string appName, string exePath) {
try {
using (RegistryKey hkml = Registry.LocalMachine) {
using (RegistryKey runKey = hkml.CreateSubKey(
@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run")) {
if (startEnabled) {
// 啟用:寫入執行路徑
runKey.SetValue(appName, exePath);
} else {
// 停用:刪除鍵值(若存在)
if (runKey.GetValue(appName) != null) {
runKey.DeleteValue(appName);
}
}
}
}
} catch (UnauthorizedAccessException) {
// 需要管理員權限
throw new Exception("請以系統管理員身分執行此程式");
} catch (Exception ex) {
throw new Exception($"開機自啟動設定失敗: {ex.Message}");
}
}
// 啟用開機自啟動
SetAutoRun(true, "MyApplication", Application.ExecutablePath);
// 停用開機自啟動
SetAutoRun(false, "MyApplication", "");
Registry.CurrentUser,無需管理員權限Registry.LocalMachine,需管理員權限
// 正確處理含空白的路徑
string exePath = "\"" + Application.ExecutablePath + "\"";
// 若有啟動參數
string exePathWithArgs = "\"" + Application.ExecutablePath + "\" /minimized";
public static bool IsAutoRunEnabled(string appName) {
using (RegistryKey runKey = Registry.LocalMachine.OpenSubKey(
@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run")) {
return runKey?.GetValue(appName) != null;
}
}
| 問題 | 原因 | 解決方案 |
|---|---|---|
| 設定無效 | 路徑含空白未加引號 | 路徑兩側加雙引號 |
| 存取被拒 | 權限不足 | 啟用 UAC 或使用 CurrentUser |
| 重複啟動 | 多次寫入相同鍵值 | 寫入前先檢查是否存在 |
| 防毒軟體攔截 | 登錄寫入行為被視為可疑 | 加入數位簽章、白名單機制 |
正確實現開機自啟動功能能提升使用者留存率,但也應尊重使用者選擇,提供明確的開關選項並說明影響範圍。