首页 > 编程语言 >C# 程序开机自启

C# 程序开机自启

时间:2023-10-07 10:25:48浏览次数:37  
标签:string C# shortcut 自启 注册表 开机 exePath 快捷方式

在 Windows 系统中,可以通过以下方式实现程序开机自启。

  1. 启动文件夹
  2. 注册表
  3. 任务计划程序
  4. 服务

启动文件夹

将需要开机自启程序的快捷方式放入启动文件夹中,即可实现程序开机自启,删除快捷方式就可以取消程序开机自启。

在 C#创建快捷方式需要添加引用 -> COM -> Windows Script Host Object Model

C:\Users<用户名>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

仅对当前用户有效,C#实现代码如下:

/// <summary>
/// 启动文件夹(当前用户)
/// </summary>
/// <param name="exePath">需要开机自启的程序路径</param>
static void AutoStartup1(string exePath)
{
    // 获取当前用户的启动文件夹
    string path = Environment.GetFolderPath(Environment.SpecialFolder.Startup);

    // 判断快捷方式是否已经存在
    bool exist = false;
    string[] files = Directory.GetFiles(path, "*.lnk");
    foreach (var item in files)
    {
        WshShell shell = new WshShell();
        IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(item);
        // Console.WriteLine($"{item} {shortcut.TargetPath}");
        if (shortcut.TargetPath == exePath)
        {
            exist = true;
            break;
        }
    }

    if (exist)
    {
        Console.WriteLine("快捷方式已经存在。");
        return;
    }

    // 创建快捷方式
    CreateShortcut($"{Path.Combine(path, "Demo4AutoStartup.lnk")}", exePath);
}

创建快捷方式的代码如下:

/// <summary>
/// 创建快捷方式
/// </summary>
/// <param name="shortcutPath"></param>
/// <param name="targetPath"></param>
static void CreateShortcut(string shortcutPath, string targetPath)
{
    var shell = new WshShell();
    var shortcut = (IWshShortcut)shell.CreateShortcut(shortcutPath);

    shortcut.TargetPath = $"{targetPath}";
    // 可选,设置程序启动参数
    // shortcut.Arguments = "";
    shortcut.WorkingDirectory = Path.GetDirectoryName(targetPath);
    shortcut.IconLocation = targetPath;

    shortcut.Save();
}

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

对所有用户有效,C#实现代码如下:

/// <summary>
/// 启动文件夹(所有用户),运行时需要管理员权限
/// </summary>
/// <param name="exePath">需要开机自启的程序路径</param>
static void AutoStartup2(string exePath)
{
    // 获取所有用户的启动文件夹
    string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonStartup);

    // 判断快捷方式是否已经存在
    bool exist = false;
    string[] files = Directory.GetFiles(path, "*.lnk");
    foreach (var item in files)
    {
        WshShell shell = new WshShell();
        IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(item);
        // Console.WriteLine($"{item} {shortcut.TargetPath}");
        if (shortcut.TargetPath == exePath)
        {
            exist = true;
            break;
        }
    }

    if (exist)
    {
        Console.WriteLine("快捷方式已经存在。");
        return;
    }

    // 创建快捷方式
    CreateShortcut($"{Path.Combine(path, "Demo4AutoStartup.lnk")}", exePath);
}

创建成功后,可以在上述文件夹中看到快捷方式。

image

image

注册表

在注册表指定位置写入值,即可实现程序开机自启,删除值就可以取消程序开机自启。

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

仅对当前用户有效,C#实现代码如下:

/// <summary>
/// 注册表(当前用户)
/// </summary>
/// <param name="exePath"></param>
/// <param name="name"></param>
static void AutoStartup3(string exePath, string name)
{
    // 判断注册表项是否已经存在
    bool exist = false;

    using (RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true))
    {
        if (key != null)
        {
            string[] valueNames = key.GetValueNames();
            foreach (string valueName in valueNames)
            {
                string valueData = key.GetValue(valueName).ToString();
                //Console.WriteLine($"{valueName} {valueData}");
                if (valueData.Contains(exePath))
                {
                    exist = true;
                    break;
                }
            }

            if (exist)
            {
                Console.WriteLine("注册表项已经存在。");
                return;
            }

            key.SetValue(name, exePath);

            // 取消开机自启,删除注册表项即可
            // key.DeleteValue(name, false);
        }
    }
}

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

对所有用户有效,C#实现代码如下:

/// <summary>
/// 注册表(所有用户),运行时需要管理员权限
/// </summary>
/// <param name="exePath"></param>
/// <param name="name"></param>
static void AutoStartup4(string exePath, string name)
{
    // 判断注册表项是否已经存在
    bool exist = false;

    using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true))
    {
        if (key != null)
        {
            string[] valueNames = key.GetValueNames();
            foreach (string valueName in valueNames)
            {
                string valueData = key.GetValue(valueName).ToString();
                Console.WriteLine($"{valueName} {valueData}");
                if (valueData.Contains(exePath))
                {
                    exist = true;
                    break;
                }
            }

            if (exist)
            {
                Console.WriteLine("注册表项已经存在。");
                return;
            }

            // 我电脑 Windows 10专业版22H2,测试发现注册表项写入在:
            // HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run
            key.SetValue(name, exePath);

            // 取消开机自启,删除注册表项即可
            // key.DeleteValue(name, false);
        }
    }
}

创建成功后,可以在上述注册表位置看到值,如下图所示:

image

image

任务计划程序

任务计划程序介绍及使用可以参考微软官方文档:https://learn.microsoft.com/zh-cn/windows/win32/taskschd/task-scheduler-start-page

C# 可以通过使用第三方库:TaskScheduler 来创建任务,在 NuGet 中搜索安装即可。

image

C#实现代码如下:

/// <summary>
/// 任务计划程序,运行时需要管理员权限
/// </summary>
/// <param name="exePath"></param>
/// <param name="taskName"></param>
static void AutoStartup5(string exePath, string taskName)
{
    using (TaskService taskService = new TaskService())
    {
        // 创建一个新任务
        TaskDefinition taskDefinition = taskService.NewTask();

        // 设置任务的触发器为系统启动
        taskDefinition.Triggers.Add(new LogonTrigger());

        // 设置要运行的程序或脚本
        taskDefinition.Actions.Add(new ExecAction(exePath, null, Path.GetDirectoryName(exePath)));

        // 注册任务
        taskService.RootFolder.RegisterTaskDefinition(taskName, taskDefinition);

        // 取消开机自启,删除任务即可
        // taskService.RootFolder.DeleteTask(taskName, false);
    }
}

创建成功后,可以在任务计划程序看到任务,如下图所示:

image

服务

我目前创建服务都是使用的 Topshelf,使用起来也非常简单,这里不过多介绍。官网:https://topshelf-project.com/index.html。

Topshelf 创建的服务想要实现开机自启,只需要设置 StartAutomatically()即可,官网链接:

https://topshelf.readthedocs.io/en/latest/configuration/config_api.html#service-start-modes

总结

推荐使用启动文件夹(当前用户)或注册表(当前用户)的方式,简单且无需管理员权限。

标签:string,C#,shortcut,自启,注册表,开机,exePath,快捷方式
From: https://www.cnblogs.com/jackylovewendy/p/17745658.html

相关文章

  • gcc编译选项总结
    转载自:https://blog.csdn.net/gatieme/article/details/21389603常用编译选项gccandg++分别是gnu的c&c++编译器gcc/g++在执行编译工作的时候,总共需要4步1.预处理,生成.i的文件[预处理器cpp]2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]3.有汇编变为目标......
  • KubeSphere 社区双周报 | OpenFunction v1.2.0 发布 | 2023.09.15-09.28
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2023.09.15-2023.09.28。贡献者名单新晋KubeSphereCon......
  • Androidstudio中 unable to execute Clang-tidy clazy-standalone is not found or ca
    这个问题可能是因为AndroidStudio不支持clazy,但是在设置菜单中仍然提供了这个选项,并且在这种情况下,它似乎被启用了¹。当通过clangd启用clang-tidy时,没有什么需要做的。当通过clangd禁用clang-tidy时,如果启用了clazy,就会出现这个错误¹。要解决这个问题,你可以尝试以下步骤:1.转......
  • SI3262—高度集成的低功耗SOC13.56MHz读卡器芯片 自带触摸
    Si3262是一款高度集成的低功耗SOC芯片,其集成了基于RISC-V核的低功耗MCU和工作在13.56MHz的非接触式读写器模块。MCU模块具有低功耗、LowPinCount、宽电压工作范围,集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC、TSC等丰富的外设。内核采用RISC-V......
  • jdbc-批量插入mssql数据库-原
    packagecom.swift.aaa;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;importjava.text.SimpleDateFormat;importjava.util.Date;publicclassTest2{//staticintcount=......
  • 数据泵(impdb)导入Oracle分片的数据库dump文件
    数据泵(impdb)导入Oracle数据库一.sqlplus登录目标数据库,创建导入的目录路径#该目录要在导入的数据库本机建立,如果是docker就在容器内部创建createdirectorydata_diras'/home/oracle/prd_imp/prd_dump';data_dir为路径名称,可自命名。路径是导出的dmp文件存放的路径必须......
  • 视频汇聚/安防监控EasyCVR指定到新的硬盘进行存储录像,如何自动挂载该磁盘?
    TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的能力,包括对人、车、......
  • Oracle数据库升级PostgreSQL 后的踩坑记录(二)之date类型处理
    踩坑二:date类型处理背景:因为业务需求,需要整个项目除了适配oracle和mysql后还需要适配PostgreSQL,在此背景下就出现了一系列的问题。接系列一databaseId映射成oracle之后问题又随之而来,由于从oracle数据库的date类型映射成postgreSQL的timestamp字段又出现了一些查询报错的问题,我......
  • 三台Centos7虚拟机部署kubernetes集群服务
     简介kubernetes,简称K8s,是用8代替8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。部署centos7虚拟机安装Vmwareworkstation......
  • 线上慎用 BigDecimal ,坑的差点被开了.....
    一、BigDecimal概述二、BigDecimal常用构造函数三、BigDecimal常用方法详解四、BigDecimal格式化五、BigDecimal常见异常六、BigDecimal总结一、BigDecimal概述Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16......