当前位置:首页 > 技术心得 > 正文内容

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

xjtudll4年前 (2022-06-18)技术心得5960

原文:https://blog.csdn.net/arrowzz/article/details/69808761

前言

最近在研究程序随系统启动,发现在 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:\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 类型的类型信息。

扫描二维码推送至手机访问。

版权声明:本文由鸟的天空发布,如需转载请注明出处。

本文链接:http://xjtudll.cn/Exp/646/

标签: C#
分享给朋友:

“C# 将程序添加开机启动的三种方式” 的相关文章

未能加载文件或程序集“file:///C:\Program Files (x86)\SAP BusinessObjects\Crystal Reports

首先我使用工具的信息为:Visual Studio 2010 ,水晶报表的版本为:13.0.0.99。 我想做的就是:使用VS2010中的WPF,将DataSet中的数据展示出来。(DataSet中的数据来自Oracle数据库) 但是我在运行的时候出现了这个问题: 未能加载文件或程序集“...

OKI单片机-如何查看编译后程序占用的RAM和ROM大小

OKI单片机-如何查看编译后程序占用的RAM和ROM大小

OKI单片机程序编译成功后,Project目录下将会多出一个map文件。通过这个文件,可以知道程序占用的RAM和ROM 1、程序占用ROM 分两种情况,第一种情况如下图: 像这种情况,占用ROM是: Total size(CODE) + Total size(TABLE) = 1916+95 =...

MSP430 fail to initialize device解决

MSP430 fail to initialize device解决

日前,在用MSP430 USB仿真器下载程序的时候,突然提示“fail to initialize device”,碰到这个问题,我的第一反应就是检查下载线与单片机是否连接正确,仔细检查了一遍连线,发现连接无误,但是就是每次都提示“fail to initialize device”,然后无法...

QuartusII编译工程后显示资源消耗为零的原因

参考资料:http://www.eefocus.com/li_mengxiang/blog/11-04/208828_3da3b.html 近日,编译了一个CPLD工程,编译OK,无任何错误,但是显示资源消耗为0,这个显然是不正常的。 网上搜了一番,一般是两种原因: 1、qurtusII编译工程后显...

金蝶K3老单原生字段设置必录

修改单据模板ICTemplate里对应的字段 select * from ICTemplate where FCaption like '%部门%' and FID = 'D01' 修改FMustInput字段,改为1,即true,则为必录...

Keil查看编译后的汇编代码

Keil查看编译后的汇编代码

在使用Keil编译C51时,一般情况下,大家都不去看汇编代码。但在某些特殊情况下,查看汇编代码就是有必要了。 (1)确认C代码是否正确 (2)研究算法 查看汇编代码前的某些准备工作是必须的:你得有工程,并确定程序编译无误。在查看汇编代码前,编译一次。 编译OK后,点Debug 有可能会提示你没有...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。