1. 程式人生 > >C# 將程式新增開機啟動的三種方式

C# 將程式新增開機啟動的三種方式

前言

最近在研究程式隨系統啟動,發現在 win7 上因為許可權的問題,寫登錄檔的時候總是會出現問題,寫不進去導致的不能自動啟動,隨後決定仔細的看一看這方面的問題。

查資料過程中主要發現有三種方式可以新增到啟動,分別是:
1. 開始選單啟動;
2. 登錄檔啟動項;
3. Windows 計劃任務。

一、開始選單啟動

在很久以前,剛開始捯飭電腦的時候,就知道的一個開機啟動的方法,那時候就是直接把程式的快捷方式建立並複製到“開始”選單的“啟動”中,並且屢試不爽,當然那時候更多的時候是手動建立,拖動到啟動中的。用程式實現也並不複雜。

總共分兩步:
1. 找到“開始”選單的“啟動”關聯的目錄;
2. 建立快捷方式到這個目錄;

建立快捷方式程式碼:

public static bool Create(string directory, string shortcutName, string targetPath,
    string description = null, string iconLocation = null)
{
    try
    {
        if (!Directory.Exists(directory))
        {
            Directory.CreateDirectory(directory);
        }

        //新增引用 Com 中搜索 Windows Script Host Object Model
string shortcutPath = Path.Combine(directory, string.Format("{0}.lnk", shortcutName)); IWshRuntimeLibrary.WshShell shell = new IWshRuntimeLibrary.WshShell(); IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(shortcutPath);//建立快捷方式物件
shortcut.TargetPath = targetPath;//指定目標路徑 shortcut.WorkingDirectory = Path.GetDirectoryName(targetPath);//設定起始位置 shortcut.WindowStyle = 1;//設定執行方式,預設為常規視窗 shortcut.Description = description;//設定備註 shortcut.IconLocation = string.IsNullOrWhiteSpace(iconLocation) ? targetPath : iconLocation;//設定圖示路徑 shortcut.Save();//儲存快捷方式 return true; } catch { } return false; }

注:在使用 WshShell 時,需要新增引用,從 Com 中搜索:Windows Script Host Object Model 新增即可。

開始選單啟動資料夾的位置獲取:

// 獲取全域性 開始 資料夾位置
Environment.GetFolderPath(Environment.SpecialFolder.CommonStartup);
// 獲取當前登入使用者的 開始 資料夾位置
Environment.GetFolderPath(Environment.SpecialFolder.Startup);

二、登錄檔開機啟動項

這個相信是大部分同學使用的情況,簡單易懂隱蔽(只是感覺很隱蔽,但是 msconfig 立馬暴露),程式碼很簡單,將啟動的專案名稱、檔案位置新增到啟動項即可。

// 新增到 當前登陸使用者的 登錄檔啟動項
RegistryKey RKey = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
RKey.SetValue("AppName", @"C:\AppName.exe");

// 新增到 所有使用者的 登錄檔啟動項
RegistryKey RKey = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
RKey.SetValue("AppName", @"C:\AppName.exe");

這裡需要注意的是,當你使用 regedit 檢視登錄檔啟動項時,會發現有的啟動項是雙引號引起來的:

AppName C:\AppName.exe

or

AppName “C:\AppName.exe”

如果你的路徑中,帶有空格,需要使用雙引號引起來,這樣能保證在啟動的時候不會出現問題,如下:

// @ 符號中的雙引號需要用兩次來轉義
RKey.SetValue("AppName", @"""C:\AppName.exe""");

三、Windows 計劃任務方式啟動

Windows 的計劃任務方式新增啟動也是可以實現自啟動的方式,但是個人感覺這種方式有點奇葩……

程式碼:

//新建任務
TaskSchedulerClass scheduler = new TaskSchedulerClass();
//連線
scheduler.Connect(null, null, null, null);
//獲取建立任務的目錄
ITaskFolder folder = scheduler.GetFolder("\\");
//設定引數
ITaskDefinition task = scheduler.NewTask(0);
task.RegistrationInfo.Author = author;//建立者
task.RegistrationInfo.Description = desc;//描述
//設定觸發機制(此處是 登陸後)
task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_LOGON);
//設定動作(此處為執行exe程式)
IExecAction action = (IExecAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC);
action.Path = file;//設定檔案目錄
task.Settings.ExecutionTimeLimit = "PT0S"; //執行任務時間超時停止任務嗎? PTOS 不開啟超時
task.Settings.DisallowStartIfOnBatteries = false;//只有在交流電源下才執行
task.Settings.RunOnlyIfIdle = false;//僅當計算機空閒下才執行

IRegisteredTask regTask =
    folder.RegisterTaskDefinition(name, task,//此處需要設定任務的名稱(name)
    (int)_TASK_CREATION.TASK_CREATE, null, //user
    null, // password
    _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN,
    "");
IRunningTask runTask = regTask.Run(null);

注意:任務計劃需要新增引用,在 Com 中搜索 TaskScheduler,新增即可,並且要在“嵌入互操作型別”設定為false,使程式編譯時,能從互操作程式集中獲取 COM 型別的型別資訊。

彙總程式碼

以上就是新增到系統啟動的三種方法,原始碼:

原始碼下載