C# 将程序添加开机启动的三种方式
作者:于大大大洋
前言
最近在研究程序随系统启动,发现在 win7 上因为权限的问题,写注册表的时候总是会出现问题,写不进去导致的不能自动启动,随后决定仔细的看一看这方面的问题。
查资料过程中主要发现有三种方式可以添加到启动,分别是:
- 开始菜单启动;
- 注册表启动项;
- Windows 计划任务。
一、开始菜单启动
在很久以前,刚开始捯饬电脑的时候,就知道的一个开机启动的方法,那时候就是直接把程序的快捷方式创建并复制到“开始”菜单的“启动”中,并且屡试不爽,当然那时候更多的时候是手动创建,拖动到启动中的。用程序实现也并不复杂。
总共分两步:
- 找到“开始”菜单的“启动”关联的目录;
- 创建快捷方式到这个目录;
创建快捷方式代码:
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 类型的类型信息。
汇总代码
以上就是添加到系统启动的三种方法,源码:源码下载
到此这篇关于C# 将程序添加开机启动的三种方式的文章就介绍到这了,更多相关C# 程序开机启动内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!