C#?將程序添加開(kāi)機(jī)啟動(dòng)的三種方式
前言
最近在研究程序隨系統(tǒng)啟動(dòng),發(fā)現(xiàn)在 win7 上因?yàn)闄?quán)限的問(wèn)題,寫(xiě)注冊(cè)表的時(shí)候總是會(huì)出現(xiàn)問(wèn)題,寫(xiě)不進(jìn)去導(dǎo)致的不能自動(dòng)啟動(dòng),隨后決定仔細(xì)的看一看這方面的問(wèn)題。
查資料過(guò)程中主要發(fā)現(xiàn)有三種方式可以添加到啟動(dòng),分別是:
- 開(kāi)始菜單啟動(dòng);
- 注冊(cè)表啟動(dòng)項(xiàng);
- Windows 計(jì)劃任務(wù)。
一、開(kāi)始菜單啟動(dòng)
在很久以前,剛開(kāi)始捯飭電腦的時(shí)候,就知道的一個(gè)開(kāi)機(jī)啟動(dòng)的方法,那時(shí)候就是直接把程序的快捷方式創(chuàng)建并復(fù)制到“開(kāi)始”菜單的“啟動(dòng)”中,并且屢試不爽,當(dāng)然那時(shí)候更多的時(shí)候是手動(dòng)創(chuàng)建,拖動(dòng)到啟動(dòng)中的。用程序?qū)崿F(xiàn)也并不復(fù)雜。
總共分兩步:
- 找到“開(kāi)始”菜單的“啟動(dòng)”關(guān)聯(lián)的目錄;
- 創(chuàng)建快捷方式到這個(gè)目錄;
創(chuàng)建快捷方式代碼:
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);//創(chuàng)建快捷方式對(duì)象 shortcut.TargetPath = targetPath;//指定目標(biāo)路徑 shortcut.WorkingDirectory = Path.GetDirectoryName(targetPath);//設(shè)置起始位置 shortcut.WindowStyle = 1;//設(shè)置運(yùn)行方式,默認(rèn)為常規(guī)窗口 shortcut.Description = description;//設(shè)置備注 shortcut.IconLocation = string.IsNullOrWhiteSpace(iconLocation) ? targetPath : iconLocation;//設(shè)置圖標(biāo)路徑 shortcut.Save();//保存快捷方式 return true; } catch { } return false; }
注:在使用 WshShell 時(shí),需要添加引用,從 Com 中搜索:Windows Script Host Object Model 添加即可。
開(kāi)始菜單啟動(dòng)文件夾的位置獲取:
// 獲取全局 開(kāi)始 文件夾位置 Environment.GetFolderPath(Environment.SpecialFolder.CommonStartup); // 獲取當(dāng)前登錄用戶的 開(kāi)始 文件夾位置 Environment.GetFolderPath(Environment.SpecialFolder.Startup);
二、注冊(cè)表開(kāi)機(jī)啟動(dòng)項(xiàng)
這個(gè)相信是大部分同學(xué)使用的情況,簡(jiǎn)單易懂隱蔽(只是感覺(jué)很隱蔽,但是 msconfig 立馬暴露),代碼很簡(jiǎn)單,將啟動(dòng)的項(xiàng)目名稱、文件位置添加到啟動(dòng)項(xiàng)即可。
// 添加到 當(dāng)前登陸用戶的 注冊(cè)表啟動(dòng)項(xiàng) RegistryKey RKey = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); RKey.SetValue("AppName", @"C:\AppName.exe"); // 添加到 所有用戶的 注冊(cè)表啟動(dòng)項(xiàng) RegistryKey RKey = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); RKey.SetValue("AppName", @"C:\AppName.exe");
這里需要注意的是,當(dāng)你使用 regedit 查看注冊(cè)表啟動(dòng)項(xiàng)時(shí),會(huì)發(fā)現(xiàn)有的啟動(dòng)項(xiàng)是雙引號(hào)引起來(lái)的:
AppName C:\AppName.exe
or
AppName “C:\AppName.exe”
如果你的路徑中,帶有空格,需要使用雙引號(hào)引起來(lái),這樣能保證在啟動(dòng)的時(shí)候不會(huì)出現(xiàn)問(wèn)題,如下:
// @ 符號(hào)中的雙引號(hào)需要用兩次來(lái)轉(zhuǎn)義 RKey.SetValue("AppName", @"""C:\AppName.exe""");
三、Windows 計(jì)劃任務(wù)方式啟動(dòng)
Windows 的計(jì)劃任務(wù)方式添加啟動(dòng)也是可以實(shí)現(xiàn)自啟動(dòng)的方式,但是個(gè)人感覺(jué)這種方式有點(diǎn)奇葩……
代碼:
//新建任務(wù) TaskSchedulerClass scheduler = new TaskSchedulerClass(); //連接 scheduler.Connect(null, null, null, null); //獲取創(chuàng)建任務(wù)的目錄 ITaskFolder folder = scheduler.GetFolder("\\"); //設(shè)置參數(shù) ITaskDefinition task = scheduler.NewTask(0); task.RegistrationInfo.Author = author;//創(chuàng)建者 task.RegistrationInfo.Description = desc;//描述 //設(shè)置觸發(fā)機(jī)制(此處是 登陸后) task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_LOGON); //設(shè)置動(dòng)作(此處為運(yùn)行exe程序) IExecAction action = (IExecAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC); action.Path = file;//設(shè)置文件目錄 task.Settings.ExecutionTimeLimit = "PT0S"; //運(yùn)行任務(wù)時(shí)間超時(shí)停止任務(wù)嗎? PTOS 不開(kāi)啟超時(shí) task.Settings.DisallowStartIfOnBatteries = false;//只有在交流電源下才執(zhí)行 task.Settings.RunOnlyIfIdle = false;//僅當(dāng)計(jì)算機(jī)空閑下才執(zhí)行 IRegisteredTask regTask = folder.RegisterTaskDefinition(name, task,//此處需要設(shè)置任務(wù)的名稱(name) (int)_TASK_CREATION.TASK_CREATE, null, //user null, // password _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN, ""); IRunningTask runTask = regTask.Run(null);
注意:任務(wù)計(jì)劃需要添加引用,在 Com 中搜索 TaskScheduler,添加即可,并且要在“嵌入互操作類型”設(shè)置為false,使程序編譯時(shí),能從互操作程序集中獲取 COM 類型的類型信息。
匯總代碼
以上就是添加到系統(tǒng)啟動(dòng)的三種方法,源碼:源碼下載
到此這篇關(guān)于C# 將程序添加開(kāi)機(jī)啟動(dòng)的三種方式的文章就介紹到這了,更多相關(guān)C# 程序開(kāi)機(jī)啟動(dòng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#單向鏈表實(shí)現(xiàn)非升序插入方法的實(shí)例詳解
單向鏈表是一種數(shù)據(jù)結(jié)構(gòu),其中元素以線性方式連接在一起,每個(gè)元素都指向下一個(gè)元素,非升序插入意味著元素不是按升序(從小到大)插入鏈表中,本文給大家介紹了C#單向鏈表實(shí)現(xiàn)非升序插入方法的實(shí)例,需要的朋友可以參考下2024-03-03C#實(shí)現(xiàn)復(fù)雜XML的序列化與反序列化
這篇文章主要介紹了C#實(shí)現(xiàn)復(fù)雜XML的序列化與反序列化的方法,是非常實(shí)用的一個(gè)技巧,需要的朋友可以參考下2014-09-09C#訪問(wèn)SQLServer增刪改查代碼實(shí)例
這篇文章主要為大家詳細(xì)介紹了C#訪問(wèn)SQLServer增刪改查代碼實(shí)例,感興趣的小伙伴們可以參考一下2016-08-08C#?CefSharp?根據(jù)輸入日期段自動(dòng)選擇日期的操作代碼
這篇文章主要介紹了C#?CefSharp?根據(jù)輸入日期段自動(dòng)選擇日期的操作代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01C#實(shí)現(xiàn)根據(jù)年份計(jì)算生肖屬相的方法
這篇文章主要介紹了C#實(shí)現(xiàn)根據(jù)年份計(jì)算生肖屬相的方法,涉及C#數(shù)組與字符串的操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03C#獲取機(jī)器碼的方法詳解(機(jī)器名,CPU編號(hào),硬盤(pán)編號(hào),網(wǎng)卡mac等)
這篇文章主要介紹了C#獲取機(jī)器碼的方法,結(jié)合實(shí)例形式詳細(xì)分析了C#獲取硬件機(jī)器名、CPU編號(hào)、硬盤(pán)編號(hào)、網(wǎng)卡mac等信息的相關(guān)實(shí)現(xiàn)方法,需要的朋友可以參考下2016-07-07WinForm實(shí)現(xiàn)同時(shí)讓兩個(gè)窗體有激活效果的特效實(shí)例
這篇文章主要介紹了WinForm實(shí)現(xiàn)同時(shí)讓兩個(gè)窗體有激活效果的特效實(shí)例,基于windows api實(shí)現(xiàn)一個(gè)窗體激活的時(shí)候給另外一個(gè)發(fā)消息的特效,在進(jìn)行C#項(xiàng)目開(kāi)發(fā)時(shí)有一定的實(shí)用價(jià)值,需要的朋友可以參考下2014-09-09C#中System.Array.CopyTo() 和 System.Array.Clon()&nbs
System.Array.CopyTo()和System.Array.Clone()是用于數(shù)組復(fù)制的兩種不同方法,本文就來(lái)介紹C,#中System.Array.CopyTo() 和 System.Array.Clon() 的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04