2023年11月28日发(作者:)

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))

{

Directory(directory);

}

//添加引⽤ Com 中搜索 Windows Script Host Object Model

string shortcutPath = e(directory, string.Format("{0}.lnk", shortcutName));

ll shell = new ll();

ortcut shortcut = (ortcut)Shortcut(shortcutPath);//创建快捷⽅式对象

Path = targetPath;//指定⽬标路径

gDirectory = ectoryName(targetPath);//设置起始位置

Style = 1;//设置运⾏⽅式,默认为常规窗⼝

ption = description;//设置备注

cation = string.IsNullOrWhiteSpace(iconLocation) ? targetPath : iconLocation;//设置图标路径

();//保存快捷⽅式

return true;

}

catch

{ }

return false;

}

注:在使⽤ WshShell 时,需要添加引⽤,从 Com 中搜索:Windows Script Host Object Model 添加即可。

开始菜单启动⽂件夹的位置获取:

// 获取全局 开始 ⽂件夹位置

Environment.GetFolderPath(Environment.Startup);

// 获取当前登录⽤户的 开始 ⽂件夹位置

Environment.GetFolderPath(Environment.p);

⼆、注册表开机启动项

这个相信是⼤部分同学使⽤的情况,简单易懂隐蔽(只是感觉很隐蔽,但是 msconfig ⽴马暴露),代码很简单,将启动的项⽬名称、⽂件

位置添加到启动项即可。

// 添加到 当前登陆⽤户的 注册表启动项

RegistryKey RKey = Registry.SubKey(@"SOFTWAREMicrosoftWindowsCurrentVersionRun");

RKey.SetValue("AppName", @"C:");

// 添加到 所有⽤户的 注册表启动项

RegistryKey RKey = Registry.SubKey(@"SOFTWAREMicrosoftWindowsCurrentVersionRun");

RKey.SetValue("AppName", @"C:");

这⾥需要注意的是,当你使⽤ regedit 查看注册表启动项时,会发现有的启动项是双引号引起来的:

AppName C:

or

AppName “C:”

如果你的路径中,带有空格,需要使⽤双引号引起来,这样能保证在启动的时候不会出现问题,如下:

// @ 符号中的双引号需要⽤两次来转义

ue("AppName", @"""C:""");

三、Windows 计划任务⽅式启动

Windows 的计划任务⽅式添加启动也是可以实现⾃启动的⽅式,但是个⼈感觉这种⽅式有点奇葩……

代码:

//新建任务

TaskSchedulerClass scheduler = new TaskSchedulerClass();

//连接

t(null, null, null, null);

//获取创建任务的⽬录

ITaskFolder folder = der("");

//设置参数

ITaskDefinition task = k(0);

task. = author;//创建者

task.ption = desc;//描述

//设置触发机制(此处是 登陆后)

task.(_TASK_TRIGGER__TRIGGER_LOGON);

//设置动作(此处为运⾏exe程序)

IExecAction action = (IExecAction)task.(_TASK_ACTION__ACTION_EXEC);

= file;//设置⽂件⽬录

task.ionTimeLimit = "PT0S"; //运⾏任务时间超时停⽌任务吗? PTOS 不开启超时

task.owStartIfOnBatteries = false;//只有在交流电源下才执⾏

task.yIfIdle = false;//仅当计算机空闲下才执⾏

IRegisteredTask regTask =

erTaskDefinition(name, task,//此处需要设置任务的名称(name

(int)_TASK__CREATE, null, //user

null, // password

_TASK_LOGON__LOGON_INTERACTIVE_TOKEN,

"");

IRunningTask runTask = (null);

注意:任务计划需要添加引⽤,在 Com 中搜索 TaskScheduler,添加即可,并且要在“嵌⼊互操作类型”设置为false,使程序编译时,

能从互操作程序集中获取 COM 类型的类型信息。

汇总代码

以上就是添加到系统启动的三种⽅法,源码: