dotnet 利用 Windows 注冊表實現開機自動啟動
本文將演示寫入 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 注冊表路線,實現應用程序開機自動啟動
核心代碼如下
static class BoostHelper
{
/// <summary>
/// 添加到啟動項,添加到注冊表,僅限 Windows 系統,寫入到 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 里,實現開機啟動
/// </summary>
/// <param name="name"></param>
/// <param name="exePath"></param>
/// <param name="arguments"></param>
[SupportedOSPlatform("Windows")]
public static void AddStartup(string name, string exePath, params string[] arguments)
{
// 添加開機啟動
// 寫入到 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 里
var runKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", true);
if (runKey is not null)
{
var valueStringBuilder = new StringBuilder();
valueStringBuilder.Append($"\"{exePath}\"");
foreach (var argument in arguments)
{
valueStringBuilder.Append($" \"{argument}\"");
}
string value = valueStringBuilder.ToString();
var existingValue = runKey.GetValue(name) as string;
if (existingValue != value)
{
runKey.SetValue(name, value);
//LogMessage($"已設置開機啟動,路徑:{exePath}");
}
else
{
//LogMessage($"已設置過開機啟動,路徑:{exePath}");
}
}
}
[SupportedOSPlatform("Windows")]
public static void RemoveStartup(string name)
{
var runKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", true);
if (runKey is not null)
{
runKey.DeleteValue(name, false);
//LogMessage($"已刪除開機啟動,路徑:{exePath}");
}
}
}
調用 BoostHelper 方法的示例代碼如下
BoostHelper.AddStartup("Test", Environment.ProcessPath!);
傳入的 AddStartup 的 name 參數表示一個注冊表項名,合理的命名即可,沒有特殊含義。同名的 name 將會相互覆蓋,利用此覆蓋機制即可實現更新啟動路徑的功能。刪除時,就是直接刪除對應的 name 項即可
寫入之后,將在開機之后,用戶登錄之后,進入桌面之后啟動程序。啟動時使用當前用戶的賬戶權限,且啟動時機是延遲啟動,相對來說比較友好,不會卡開機。這是比較常用的開機自啟的注冊表
在 Windows 上,還有很多其他注冊表項可以用來添加開機自啟,其差別的核心維度就是由什么、在什么時機啟動
常見的添加開機自啟的注冊表項如下
- 當前用戶專有的啟動文件夾:
%AppData%\Microsoft\Windows\Start Menu\Programs - 所有用戶有效的啟動文件夾:
%ProgramData%\Microsoft\Windows\Start Menu\Programs - Userinit注冊鍵
- 注冊表地址:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon - 通常該注冊表下面有一個
C:\Windows\system32\userinit.exe,值,但這個鍵值是允許用逗號來分隔多個程序的,比如 C:\Windows\system32\userinit.exe,C:\lindexi.exe(舉例)
- 注冊表地址:
- Explorer\Run注冊鍵
- 當前用戶的注冊表地址:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run - 機器級的注冊表地址:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
- 當前用戶的注冊表地址:
- RunServicesOnce注冊鍵
- 當前用戶的注冊表地址:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce - 機器級的注冊表地址:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce - RunServicesOnce注冊鍵是用來啟動服務的,啟動時間是在用戶登錄之前,而且是先于其它通過注冊鍵啟動的程序
- 當前用戶的注冊表地址:
- RunServices注冊鍵
- 當前用戶的注冊表地址:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices - 機器級的注冊表地址:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices - RunServices注冊鍵指定的程序緊接RunServicesOnce指定的程序之后運行,啟動時間也是在用戶登錄之前
- 當前用戶的注冊表地址:
- RunOnce注冊鍵
- 注冊表地址:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceHKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\RunOnceHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
- HKEY_LOCAL_MACHINE下面的RunOnce注冊鍵會在用戶登錄之后立即運行程序,運行的時機是在其它Run鍵指定的程序之前
- HKEY_CURRENT_USER則會啟動比較慢,它會在操作系統處理其他Run鍵以及“啟動”文件夾的內容之后運行
- 注冊表地址:
- Run注冊鍵
- 注冊表地址:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunHKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\RunHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
- Run是自動運行程序最常用的注冊表。會先執行HKEY_LOCAL_MACHINE下的Run注冊鍵內容,再執行HKEY_CURRENT_USER下的Run注冊鍵內容,但兩者都是在處理“啟動文件夾”之前
- 注冊表地址:
除了本文記錄的寫注冊表方法之外,還可以在啟動文件夾存放快捷方式實現開機自啟,詳細請參閱 WPF 開發自動開機啟動程序
本文代碼放在 github 和 gitee 上,可以使用如下命令行拉取代碼。我整個代碼倉庫比較龐大,使用以下命令行可以進行部分拉取,拉取速度比較快
先創建一個空文件夾,接著使用命令行 cd 命令進入此空文件夾,在命令行里面輸入以下代碼,即可獲取到本文的代碼
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin e2a02a9aaa2148cc580cdbc91b92a5970d4b470f
以上使用的是國內的 gitee 的源,如果 gitee 不能訪問,請替換為 github 的源。請在命令行繼續輸入以下代碼,將 gitee 源換成 github 源進行拉取代碼。如果依然拉取不到代碼,可以發郵件向我要代碼
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin e2a02a9aaa2148cc580cdbc91b92a5970d4b470f
獲取代碼之后,進入 Workbench/QeyeqawkayqaiWhonirikaywi 文件夾,即可獲取到源代碼
博客園博客只做備份,博客發布就不再更新,如果想看最新博客,請訪問 https://blog.lindexi.com/
如圖片看不見,請在瀏覽器開啟不安全http內容兼容

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名[林德熙](http://www.rzrgm.cn/lindexi)(包含鏈接:http://www.rzrgm.cn/lindexi ),不得用于商業目的,基于本文修改后的作品務必以相同的許可發布。如有任何疑問,請與我[聯系](mailto:lindexi_gd@163.com)。

浙公網安備 33010602011771號