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:\");
// 添加到所有⽤户的注册表启动项
RegistryKey RKey = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\Curr
entVersion\Run");
RKey.SetValue("AppName", @"C:\");
这⾥需要注意的是,当你使⽤ regedit 查看注册表启动项时,会发现有的启动项是双引号引起来的:
AppName C:\
or
AppName “C:\”
如果你的路径中,带有空格,需要使⽤双引号引起来,这样能保证在启动的时候不会出现问题,如下:
// @ 符号中的双引号需要⽤两次来转义
RKey.SetValue("AppName", @"""C:\""");
三、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 类型的类型信息。
汇总代码
以上就是添加到系统启动的三种⽅法,源码:
发布评论