一、前言
关于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("The path you want", "Restart.lnk"));
//有些目录下不允许建快捷方式 shortcut.TargetPath = System.IO.Path.Combine("Your exe file path", "Restart.vbs"); shortcut.WorkingDirectory = "The path you want"; shortcut.WindowStyle = 7; shortcut.Save(); File.Move(System.IO.Path.Combine("The path you want", "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");