C#程序实现软件开机自动启动的两种经常使用方法

C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种经常使用方法函数的示例与实例带详细注释html

方法一:将软件的快捷方式建立到计算机的自动启动目录下(不须要管理员权限)shell

1.必要引用app

复制代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using IWshRuntimeLibrary; //添加引用,在 Com 中搜索 Windows Script Host Object Model using System.Diagnostics;
复制代码

2.代码实现-只须要调用SetMeAutoStart(bool onOff)方法就能够了,参数onOff表示自启开关函数

复制代码
/// <summary>
        /// 快捷方式名称-任意自定义 /// </summary>
        private const string QuickName = "TCNVMClient"; /// <summary>
        /// 自动获取系统自动启动目录 /// </summary>
        private string systemStartPath { get { return Environment.GetFolderPath(Environment.SpecialFolder.Startup); } } /// <summary>
        /// 自动获取程序完整路径 /// </summary>
        private string appAllPath { get { return Process.GetCurrentProcess().MainModule.FileName; } } /// <summary>
        /// 自动获取桌面目录 /// </summary>
        private string desktopPath { get { return Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); } } /// <summary>
        /// 设置开机自动启动-只须要调用改方法就能够了参数里面的bool变量是控制开机启动的开关的,默认为开启自启启动 /// </summary>
        /// <param name="onOff">自启开关</param>
        public void SetMeAutoStart(bool onOff = true) { if (onOff)//开机启动
 { //获取启动路径应用程序快捷方式的路径集合
                List<string> shortcutPaths = GetQuickFromFolder(systemStartPath, appAllPath); //存在2个以快捷方式则保留一个快捷方式-避免重复多于
                if (shortcutPaths.Count >= 2) { for (int i = 1; i < shortcutPaths.Count; i++) { DeleteFile(shortcutPaths[i]); } } else if (shortcutPaths.Count < 1)//不存在则建立快捷方式
 { CreateShortcut(systemStartPath, QuickName, appAllPath, "中吉售货机"); } } else//开机不启动
 { //获取启动路径应用程序快捷方式的路径集合
                List<string> shortcutPaths = GetQuickFromFolder(systemStartPath, appAllPath); //存在快捷方式则遍历所有删除
                if (shortcutPaths.Count > 0) { for (int i = 0; i < shortcutPaths.Count; i++) { DeleteFile(shortcutPaths[i]); } } } //建立桌面快捷方式-若是须要能够取消注释 //CreateDesktopQuick(desktopPath, QuickName, appAllPath);
 } /// <summary>
        /// 向目标路径建立指定文件的快捷方式 /// </summary>
        /// <param name="directory">目标目录</param>
        /// <param name="shortcutName">快捷方式名字</param>
        /// <param name="targetPath">文件彻底路径</param>
        /// <param name="description">描述</param>
        /// <param name="iconLocation">图标地址</param>
        /// <returns>成功或失败</returns>
        private bool CreateShortcut(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));          //合成路径
                WshShell shell = new IWshRuntimeLibrary.WshShell(); 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(Exception ex) { string temp = ex.Message; temp = ""; } return false; } /// <summary>
        /// 获取指定文件夹下指定应用程序的快捷方式路径集合 /// </summary>
        /// <param name="directory">文件夹</param>
        /// <param name="targetPath">目标应用程序路径</param>
        /// <returns>目标应用程序的快捷方式</returns>
        private List<string> GetQuickFromFolder(string directory, string targetPath) { List<string> tempStrs = new List<string>(); tempStrs.Clear(); string tempStr = null; string[] files = Directory.GetFiles(directory, "*.lnk"); if (files == null || files.Length < 1) { return tempStrs; } for (int i = 0; i < files.Length; i++) { //files[i] = string.Format("{0}\\{1}", directory, files[i]);
                tempStr = GetAppPathFromQuick(files[i]); if (tempStr == targetPath) { tempStrs.Add(files[i]); } } return tempStrs; } /// <summary>
        /// 获取快捷方式的目标文件路径-用于判断是否已经开启了自动启动 /// </summary>
        /// <param name="shortcutPath"></param>
        /// <returns></returns>
        private string GetAppPathFromQuick(string shortcutPath) { //快捷方式文件的路径 = @"d:\Test.lnk";
            if (System.IO.File.Exists(shortcutPath)) { WshShell shell = new WshShell(); IWshShortcut shortct = (IWshShortcut)shell.CreateShortcut(shortcutPath); //快捷方式文件指向的路径.Text = 当前快捷方式文件IWshShortcut类.TargetPath; //快捷方式文件指向的目标目录.Text = 当前快捷方式文件IWshShortcut类.WorkingDirectory;
                return shortct.TargetPath; } else { return ""; } } /// <summary>
        /// 根据路径删除文件-用于取消自启时从计算机自启目录删除程序的快捷方式 /// </summary>
        /// <param name="path">路径</param>
        private void DeleteFile(string path) { FileAttributes attr = System.IO. File.GetAttributes(path); if (attr == FileAttributes.Directory) { Directory.Delete(path, true); } else { System.IO.File.Delete(path); } } /// <summary>
        /// 在桌面上建立快捷方式-若是须要能够调用 /// </summary>
        /// <param name="desktopPath">桌面地址</param>
        /// <param name="appPath">应用路径</param>
        public void CreateDesktopQuick(string desktopPath = "", string quickName = "", string appPath = "") { List<string> shortcutPaths = GetQuickFromFolder(desktopPath, appPath); //若是没有则建立
            if (shortcutPaths.Count < 1) { CreateShortcut(desktopPath, quickName, appPath, "软件描述"); } }
复制代码

方法二:修改计算机注册表的方式(须要管理员权限)post

using Microsoft.Win32; using System; using System.Windows.Forms; using System.Diagnostics;

2.代码实现-只须要调用SetMeStart(bool onOff)方法就能够了,参数onOff表示自启开关ui

复制代码
/// <summary>
        /// 将本程序设为开启自启 /// </summary>
        /// <param name="onOff">自启开关</param>
        /// <returns></returns>
        public static bool SetMeStart(bool onOff) { bool isOk = false; string appName = Process.GetCurrentProcess().MainModule.ModuleName; string appPath = Process.GetCurrentProcess().MainModule.FileName; isOk = SetAutoStart(onOff, appName, appPath); return isOk; } /// <summary>
        /// 将应用程序设为或不设为开机启动 /// </summary>
        /// <param name="onOff">自启开关</param>
        /// <param name="appName">应用程序名</param>
        /// <param name="appPath">应用程序彻底路径</param>
        public static bool SetAutoStart(bool onOff, string appName, string appPath) { bool isOk = true; //若是从没有设为开机启动设置到要设为开机启动
            if (!IsExistKey(appName) && onOff) { isOk = SelfRunning(onOff, appName, @appPath); } //若是从设为开机启动设置到不要设为开机启动
            else if (IsExistKey(appName) && !onOff) { isOk = SelfRunning(onOff, appName, @appPath); } return isOk; } /// <summary>
        /// 判断注册键值对是否存在,便是否处于开机启动状态 /// </summary>
        /// <param name="keyName">键值名</param>
        /// <returns></returns>
        private static bool IsExistKey(string keyName) { try { bool _exist = false; RegistryKey local = Registry.LocalMachine; RegistryKey runs = local.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true); if (runs == null) { RegistryKey key2 = local.CreateSubKey("SOFTWARE"); RegistryKey key3 = key2.CreateSubKey("Microsoft"); RegistryKey key4 = key3.CreateSubKey("Windows"); RegistryKey key5 = key4.CreateSubKey("CurrentVersion"); RegistryKey key6 = key5.CreateSubKey("Run"); runs = key6; } string[] runsName = runs.GetValueNames(); foreach (string strName in runsName) { if (strName.ToUpper() == keyName.ToUpper()) { _exist = true; return _exist; } } return _exist; } catch { return false; } } /// <summary>
        /// 写入或删除注册表键值对,即设为开机启动或开机不启动 /// </summary>
        /// <param name="isStart">是否开机启动</param>
        /// <param name="exeName">应用程序名</param>
        /// <param name="path">应用程序路径带程序名</param>
        /// <returns></returns>
        private static bool SelfRunning(bool isStart, string exeName, string path) { try { RegistryKey local = Registry.LocalMachine; RegistryKey key = local.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true); if (key == null) { local.CreateSubKey("SOFTWARE//Microsoft//Windows//CurrentVersion//Run"); } //若开机自启动则添加键值对
                if (isStart) { key.SetValue(exeName, path); key.Close(); } else//不然删除键值对
 { string[] keyNames = key.GetValueNames(); foreach (string keyName in keyNames) { if (keyName.ToUpper() == exeName.ToUpper()) { key.DeleteValue(exeName); key.Close(); } } } } catch (Exception ex) { string ss = ex.Message; return false; //throw;
 } return true; }
复制代码

3.如何获取管理员权限请参考spa

C#如何以管理员身份运行程序 - 酷小孩 - 博客园  http://www.javashuo.com/article/p-epoagggb-gg.html.net

C#程序以管理员权限运行 - Cosmic_Spy - 博客园  https://www.cnblogs.com/Interkey/p/RunAsAdmin.htmlcode

4.实测稳定可用,但愿对你有帮助,谢谢支持。orm

 

 

出处:https://blog.csdn.net/liyu3519/article/details/81257839

相关文章
相关标签/搜索