一、前言
關於C#開機自動啟動程序的方法,網上出現比較多的是修改注冊表:
1. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run或者RunOnce
2.HKEY_Current_User\Software\Microsoft\Windows\CurrentVersion\Run或者RunOnce
將你想要自動開機執行的程序的名稱與路徑寫入該注冊表就能實現開機自動啟動,但是!這個方法是有問題的:
1. 微軟自Vista之後對注冊表的權限管理更加嚴格,需要一系列的權限操作,對注冊表操作需要app.manifest文件:
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
並且操作注冊表時還需要
Registry.LocalMachine.OpenSubKey(Yoursubkey,
RegistryKeyPermissionCheck.ReadWriteSubTree,System.Security.AccessControl.RegistryRights.FullControl);實現全部控制
2. 我在編寫開機自動啟動程序時也是先用修改注冊表的方法,但是發現針對不同電腦不是每次都能成功的,也就是說修改注冊表的方法的成功率並不是100%
二、一個古老而可靠的方法
其實有一個相當可靠而且實用的方法,那就是在計算機【開始/啟動】文件夾中,將你想要開機自動啟動的程序的快捷方式放入進去。這樣下次開機就會執行這個文件夾的程序,
不要忘記 !如果不是每次開機都要執行這個程序的話,你應該在程序中有一個刪除該快捷方式的語句。
下面是我的開機自動程序的組成部分:
1. 需要開機自動執行的程序 Restart.exe
2. 一個引導執行Restart.exe的腳本 Restart.vbs
如果Restart.exe與.vbs 在客戶機的任意一個硬盤上的任意一個位置,我的流程是:
1. 生成Restart.vbs的快捷方式Restart.lnk——>將.lnk剪切至【開始/啟動】文件夾內
2. 當下次開機時會先通過快捷方式.lnk執行.vbs,再通過.vbs執行.exe
3. 當exe裡的程序執行完之後,用File.Delete將.lnk刪除(我可不想每次開機執行這個.lnk)
三、代碼實現
1. vbs腳本代碼 (這個腳本必須和.exe在同一文件夾中)
Set shell =Wscript.createobject("WScript.Shell") shell.Run "Restart.exe",0,False
2. 創建快捷方式的代碼 (需要引入COM組件,名稱為Windows Script Host Object Model)
if (!File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\Restart.lnk")) { IWshRuntimeLibrary.WshShell shell = new IWshRuntimeLibrary.WshShell(); IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(System.IO.Path.Combine("Your exe file path", "Restart.lnk")); shortcut.TargetPath = System.IO.Path.Combine("Your exe file path", "Restart.vbs"); shortcut.WorkingDirectory = "Your exe file path"; shortcut.WindowStyle = 7; shortcut.Save(); File.Move(System.IO.Path.Combine("Your exe file path", "Restart.lnk"), Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\Restart.lnk"); }
注意!最後一句!
File.Move的Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\Restart.lnk"
不能寫成
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup),"Restart.lnk")
3. 執行完exe中的主要代碼後,刪除該快捷方式以防每次開機都執行這個程序(根據自已的需要)
File.Delete(Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\Restart.lnk");