C# 将程序添加开机启动的三种方式

 更新时间:2024年01月31日 09:25:25   作者:于大大大洋  
本文主要介绍了C# 将程序添加开机启动的三种方式,主要包含开始菜单启动,注册表启动项和Windows 计划任务这三种方法,具有一定的参考价值,感兴趣的可以了解一下

前言

最近在研究程序随系统启动,发现在 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# 程序开机启动内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#单向链表实现非升序插入方法的实例详解

    C#单向链表实现非升序插入方法的实例详解

    单向链表是一种数据结构,其中元素以线性方式连接在一起,每个元素都指向下一个元素,非升序插入意味着元素不是按升序(从小到大)插入链表中,本文给大家介绍了C#单向链表实现非升序插入方法的实例,需要的朋友可以参考下
    2024-03-03
  • C#实现复杂XML的序列化与反序列化

    C#实现复杂XML的序列化与反序列化

    这篇文章主要介绍了C#实现复杂XML的序列化与反序列化的方法,是非常实用的一个技巧,需要的朋友可以参考下
    2014-09-09
  • C# 实现抓包的实例代码

    C# 实现抓包的实例代码

    这篇文章主要介绍了C# 实现抓包的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • C#访问SQLServer增删改查代码实例

    C#访问SQLServer增删改查代码实例

    这篇文章主要为大家详细介绍了C#访问SQLServer增删改查代码实例,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • C# CefSharp 根据输入日期段自动选择日期的操作代码

    C# CefSharp 根据输入日期段自动选择日期的操作代码

    这篇文章主要介绍了C# CefSharp 根据输入日期段自动选择日期的操作代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • C#实现根据年份计算生肖属相的方法

    C#实现根据年份计算生肖属相的方法

    这篇文章主要介绍了C#实现根据年份计算生肖属相的方法,涉及C#数组与字符串的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • C#获取机器码的方法详解(机器名,CPU编号,硬盘编号,网卡mac等)

    C#获取机器码的方法详解(机器名,CPU编号,硬盘编号,网卡mac等)

    这篇文章主要介绍了C#获取机器码的方法,结合实例形式详细分析了C#获取硬件机器名、CPU编号、硬盘编号、网卡mac等信息的相关实现方法,需要的朋友可以参考下
    2016-07-07
  • 浅谈C#数组(一)

    浅谈C#数组(一)

    本篇文章小编要得大家介绍的是C#数组,数组是一种数据结构,它可以包含同一个类型的多个元素,如果需要使用同一类型的多个对象,可以使用数组和集合,需要的朋友可以参考下面文章的具体内容
    2021-09-09
  • WinForm实现同时让两个窗体有激活效果的特效实例

    WinForm实现同时让两个窗体有激活效果的特效实例

    这篇文章主要介绍了WinForm实现同时让两个窗体有激活效果的特效实例,基于windows api实现一个窗体激活的时候给另外一个发消息的特效,在进行C#项目开发时有一定的实用价值,需要的朋友可以参考下
    2014-09-09
  • C#中System.Array.CopyTo() 和 System.Array.Clon() 的区别

    C#中System.Array.CopyTo() 和 System.Array.Clon()&nbs

    System.Array.CopyTo()和System.Array.Clone()是用于数组复制的两种不同方法,本文就来介绍C,#中System.Array.CopyTo() 和 System.Array.Clon() 的区别,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04

最新评论