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

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

1.必要引用

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using IWshRuntimeLibrary;
  7. using System.Diagnostics;

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

  1. /// <summary>
  2. /// 快捷方式名称-任意自定义
  3. /// </summary>
  4. private const string QuickName = "TCNVMClient";
  5.  
  6. /// <summary>
  7. /// 自动获取系统自动启动目录
  8. /// </summary>
  9. private string systemStartPath { get { return Environment.GetFolderPath(Environment.SpecialFolder.Startup); } }
  10.  
  11. /// <summary>
  12. /// 自动获取程序完整路径
  13. /// </summary>
  14. private string appAllPath { get { return Process.GetCurrentProcess().MainModule.FileName; } }
  15.  
  16. /// <summary>
  17. /// 自动获取桌面目录
  18. /// </summary>
  19. private string desktopPath { get { return Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); } }
  20.  
  21. /// <summary>
  22. /// 设置开机自动启动-只需要调用改方法就可以了参数里面的bool变量是控制开机启动的开关的,默认为开启自启启动
  23. /// </summary>
  24. /// <param name="onOff">自启开关</param>
  25. public void SetMeAutoStart(bool onOff = true)
  26. {
  27. if (onOff)//开机启动
  28. {
  29. //获取启动路径应用程序快捷方式的路径集合
  30. List<string> shortcutPaths = GetQuickFromFolder(systemStartPath, appAllPath);
  31. //存在2个以快捷方式则保留一个快捷方式-避免重复多于
  32. if (shortcutPaths.Count >= )
  33. {
  34. for (int i = ; i < shortcutPaths.Count; i++)
  35. {
  36. DeleteFile(shortcutPaths[i]);
  37. }
  38. }
  39. else if (shortcutPaths.Count < )//不存在则创建快捷方式
  40. {
  41. CreateShortcut(systemStartPath, QuickName, appAllPath, "中吉售货机");
  42. }
  43. }
  44. else//开机不启动
  45. {
  46. //获取启动路径应用程序快捷方式的路径集合
  47. List<string> shortcutPaths = GetQuickFromFolder(systemStartPath, appAllPath);
  48. //存在快捷方式则遍历全部删除
  49. if (shortcutPaths.Count > )
  50. {
  51. for (int i = ; i < shortcutPaths.Count; i++)
  52. {
  53. DeleteFile(shortcutPaths[i]);
  54. }
  55. }
  56. }
  57. //创建桌面快捷方式-如果需要可以取消注释
  58. //CreateDesktopQuick(desktopPath, QuickName, appAllPath);
  59. }
  60.  
  61. /// <summary>
  62. /// 向目标路径创建指定文件的快捷方式
  63. /// </summary>
  64. /// <param name="directory">目标目录</param>
  65. /// <param name="shortcutName">快捷方式名字</param>
  66. /// <param name="targetPath">文件完全路径</param>
  67. /// <param name="description">描述</param>
  68. /// <param name="iconLocation">图标地址</param>
  69. /// <returns>成功或失败</returns>
  70. private bool CreateShortcut(string directory, string shortcutName, string targetPath, string description = null, string iconLocation = null)
  71. {
  72. try
  73. {
  74. if (!Directory.Exists(directory)) Directory.CreateDirectory(directory); //目录不存在则创建
  75. //添加引用 Com 中搜索 Windows Script Host Object Model
  76. string shortcutPath = Path.Combine(directory, string.Format("{0}.lnk", shortcutName)); //合成路径
  77. WshShell shell = new IWshRuntimeLibrary.WshShell();
  78. IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(shortcutPath); //创建快捷方式对象
  79. shortcut.TargetPath = targetPath; //指定目标路径
  80. shortcut.WorkingDirectory = Path.GetDirectoryName(targetPath); //设置起始位置
  81. shortcut.WindowStyle = ; //设置运行方式,默认为常规窗口
  82. shortcut.Description = description; //设置备注
  83. shortcut.IconLocation = string.IsNullOrWhiteSpace(iconLocation) ? targetPath : iconLocation; //设置图标路径
  84. shortcut.Save(); //保存快捷方式
  85. return true;
  86. }
  87. catch(Exception ex)
  88. {
  89. string temp = ex.Message;
  90. temp = "";
  91. }
  92. return false;
  93. }
  94.  
  95. /// <summary>
  96. /// 获取指定文件夹下指定应用程序的快捷方式路径集合
  97. /// </summary>
  98. /// <param name="directory">文件夹</param>
  99. /// <param name="targetPath">目标应用程序路径</param>
  100. /// <returns>目标应用程序的快捷方式</returns>
  101. private List<string> GetQuickFromFolder(string directory, string targetPath)
  102. {
  103. List<string> tempStrs = new List<string>();
  104. tempStrs.Clear();
  105. string tempStr = null;
  106. string[] files = Directory.GetFiles(directory, "*.lnk");
  107. if (files == null || files.Length < )
  108. {
  109. return tempStrs;
  110. }
  111. for (int i = ; i < files.Length; i++)
  112. {
  113. //files[i] = string.Format("{0}\\{1}", directory, files[i]);
  114. tempStr = GetAppPathFromQuick(files[i]);
  115. if (tempStr == targetPath)
  116. {
  117. tempStrs.Add(files[i]);
  118. }
  119. }
  120. return tempStrs;
  121. }
  122.  
  123. /// <summary>
  124. /// 获取快捷方式的目标文件路径-用于判断是否已经开启了自动启动
  125. /// </summary>
  126. /// <param name="shortcutPath"></param>
  127. /// <returns></returns>
  128. private string GetAppPathFromQuick(string shortcutPath)
  129. {
  130. //快捷方式文件的路径 = @"d:\Test.lnk";
  131. if (System.IO.File.Exists(shortcutPath))
  132. {
  133. WshShell shell = new WshShell();
  134. IWshShortcut shortct = (IWshShortcut)shell.CreateShortcut(shortcutPath);
  135. //快捷方式文件指向的路径.Text = 当前快捷方式文件IWshShortcut类.TargetPath;
  136. //快捷方式文件指向的目标目录.Text = 当前快捷方式文件IWshShortcut类.WorkingDirectory;
  137. return shortct.TargetPath;
  138. }
  139. else
  140. {
  141. return "";
  142. }
  143. }
  144.  
  145. /// <summary>
  146. /// 根据路径删除文件-用于取消自启时从计算机自启目录删除程序的快捷方式
  147. /// </summary>
  148. /// <param name="path">路径</param>
  149. private void DeleteFile(string path)
  150. {
  151. FileAttributes attr = System.IO. File.GetAttributes(path);
  152. if (attr == FileAttributes.Directory)
  153. {
  154. Directory.Delete(path, true);
  155. }
  156. else
  157. {
  158. System.IO.File.Delete(path);
  159. }
  160. }
  161.  
  162. /// <summary>
  163. /// 在桌面上创建快捷方式-如果需要可以调用
  164. /// </summary>
  165. /// <param name="desktopPath">桌面地址</param>
  166. /// <param name="appPath">应用路径</param>
  167. public void CreateDesktopQuick(string desktopPath = "", string quickName = "", string appPath = "")
  168. {
  169. List<string> shortcutPaths = GetQuickFromFolder(desktopPath, appPath);
  170. //如果没有则创建
  171. if (shortcutPaths.Count < )
  172. {
  173. CreateShortcut(desktopPath, quickName, appPath, "软件描述");
  174. }
  175. }

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

  1. using Microsoft.Win32;
  2. using System;
  3. using System.Windows.Forms;
  4. using System.Diagnostics;

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

  1. /// <summary>
  2. /// 将本程序设为开启自启
  3. /// </summary>
  4. /// <param name="onOff">自启开关</param>
  5. /// <returns></returns>
  6. public static bool SetMeStart(bool onOff)
  7. {
  8. bool isOk = false;
  9. string appName = Process.GetCurrentProcess().MainModule.ModuleName;
  10. string appPath = Process.GetCurrentProcess().MainModule.FileName;
  11. isOk = SetAutoStart(onOff, appName, appPath);
  12. return isOk;
  13. }
  14.  
  15. /// <summary>
  16. /// 将应用程序设为或不设为开机启动
  17. /// </summary>
  18. /// <param name="onOff">自启开关</param>
  19. /// <param name="appName">应用程序名</param>
  20. /// <param name="appPath">应用程序完全路径</param>
  21. public static bool SetAutoStart(bool onOff, string appName, string appPath)
  22. {
  23. bool isOk = true;
  24. //如果从没有设为开机启动设置到要设为开机启动
  25. if (!IsExistKey(appName) && onOff)
  26. {
  27. isOk = SelfRunning(onOff, appName, @appPath);
  28. }
  29. //如果从设为开机启动设置到不要设为开机启动
  30. else if (IsExistKey(appName) && !onOff)
  31. {
  32. isOk = SelfRunning(onOff, appName, @appPath);
  33. }
  34. return isOk;
  35. }
  36.  
  37. /// <summary>
  38. /// 判断注册键值对是否存在,即是否处于开机启动状态
  39. /// </summary>
  40. /// <param name="keyName">键值名</param>
  41. /// <returns></returns>
  42. private static bool IsExistKey(string keyName)
  43. {
  44. try
  45. {
  46. bool _exist = false;
  47. RegistryKey local = Registry.LocalMachine;
  48. RegistryKey runs = local.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
  49. if (runs == null)
  50. {
  51. RegistryKey key2 = local.CreateSubKey("SOFTWARE");
  52. RegistryKey key3 = key2.CreateSubKey("Microsoft");
  53. RegistryKey key4 = key3.CreateSubKey("Windows");
  54. RegistryKey key5 = key4.CreateSubKey("CurrentVersion");
  55. RegistryKey key6 = key5.CreateSubKey("Run");
  56. runs = key6;
  57. }
  58. string[] runsName = runs.GetValueNames();
  59. foreach (string strName in runsName)
  60. {
  61. if (strName.ToUpper() == keyName.ToUpper())
  62. {
  63. _exist = true;
  64. return _exist;
  65. }
  66. }
  67. return _exist;
  68.  
  69. }
  70. catch
  71. {
  72. return false;
  73. }
  74. }
  75.  
  76. /// <summary>
  77. /// 写入或删除注册表键值对,即设为开机启动或开机不启动
  78. /// </summary>
  79. /// <param name="isStart">是否开机启动</param>
  80. /// <param name="exeName">应用程序名</param>
  81. /// <param name="path">应用程序路径带程序名</param>
  82. /// <returns></returns>
  83. private static bool SelfRunning(bool isStart, string exeName, string path)
  84. {
  85. try
  86. {
  87. RegistryKey local = Registry.LocalMachine;
  88. RegistryKey key = local.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
  89. if (key == null)
  90. {
  91. local.CreateSubKey("SOFTWARE//Microsoft//Windows//CurrentVersion//Run");
  92. }
  93. //若开机自启动则添加键值对
  94. if (isStart)
  95. {
  96. key.SetValue(exeName, path);
  97. key.Close();
  98. }
  99. else//否则删除键值对
  100. {
  101. string[] keyNames = key.GetValueNames();
  102. foreach (string keyName in keyNames)
  103. {
  104. if (keyName.ToUpper() == exeName.ToUpper())
  105. {
  106. key.DeleteValue(exeName);
  107. key.Close();
  108. }
  109. }
  110. }
  111. }
  112. catch (Exception ex)
  113. {
  114. string ss = ex.Message;
  115. return false;
  116. //throw;
  117. }
  118.  
  119. return true;
  120. }

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

C#如何以管理员身份运行程序 - 酷小孩 - 博客园  https://www.cnblogs.com/babycool/p/3569183.html

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

4.实测稳定可用,希望对你有帮助,谢谢支持。

转载:https://blog.csdn.net/liyu3519/article/details/81257839

C#程序实现软件开机自动启动的两种常用方法的更多相关文章

  1. C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式

    C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式 C#实现自动启动的方法-两种方法 源码下载地址: ...

  2. linux中将程序加入到开机自动启动

    如果将在linux中将命令或者程序设置为开机自动启动,只需要进入到将对应命令加入到/etc/rc.d/rc.local文件里即可,如下 打开文件,vi /etc/rc.d/rc.local #!/bi ...

  3. Android系统移植与调试之------->如何修改开机动画的两种方式剖析

    首先,我们先来分析一下源码: frameworks/base/cmds/bootanimation/BootAnimation.cpp 首先看一下定义的常量: BootAnimation::ready ...

  4. apache软件no_ssl和openssl两种类型的区别

    apache软件同一版本有两种类型:no_ssl和openssl: openssl多了个ssl安全认证模式,它的协议是HTTPS而不是HTTP,这就是带有SSL的服务器与一般网页服务器的区别了. 一般 ...

  5. 在Quartus II中分配管脚的两种常用方法

    在Quartus II中分配管脚的两种常用方法 示范程序 seg7_test.v 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 /* * ...

  6. jQuery验证元素是否为空的两种常用方法

    这篇文章主要介绍了jQuery验证元素是否为空的两种常用方法,实例分析了两种常用的判断为空技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了jQuery验证元素是否为空的两种常用方法.分享给 ...

  7. vue——props的两种常用方法

    vue--props的两种常用方法 1.实现父-->子的通信 举例如下: 父组件 parent.vue <children :channel="object1"> ...

  8. win7中的Uac与开机自动启动(好几种办法,特别是用不带UAC的程序启动UAC程序是一个简单的好办法,写驱动自启动更是了不得)

    在另一篇文章中已经介绍了给Exe加上Uac的方法,在使用的过程中我们会发现,如果把带Uac的Exe写入注册表的Run中,是无法实现开机自动启动的,原因就是带Uac的exe需要申请管理员权限,以便运行执 ...

  9. WinForm软件开机自动启动详细方法

    现在正在制作一个物资公司的管理软件,把自己掌握的学到的一点点细细的讲给喜欢C#的同仁们,互相交流. 想要给你制作的应用程序做一个开机启动,很方便,你可以让用户选择,在你的工具栏中的某个下拉菜单里添加一 ...

随机推荐

  1. gii配置

    下载完成后不要设置urlManager http://zjm.testyii.com/index.php?r=gii 即可进入gii页面 或者是 将'urlManager'=> [ 'enabl ...

  2. JAVA程序CPU 100%问题排查

    做JAVA开发的同学一定遇到过的爆表问题,看这里解决  https://www.cnblogs.com/qcloud1001/p/9773947.html   本文由净地发表于云+社区专栏 记一次Ja ...

  3. redis & memcache 性能比较

    redis和memcache非常像的,都是key,value的方式,将数据存放内存中.最近在学习redis,在网上看了一些这方面的资料,有三种观点: redis读写内存比memcache快 memca ...

  4. gitlab导入现在git项目

    确保管理员所在机器的ssh 公钥已经保存在gitlab网站上. 这样管理员可以在自己的机器上和gitlab系统交互. 现在在管理员自己的机器上,进入项目目录(项目目录拷贝自git server,目录后 ...

  5. Javascript高级编程学习笔记(60)—— 事件(4)事件类型

    事件类型 Web浏览器中可能发生的事件有许多种类型 不同类型的事件都有着自己独特的信息 在“DOM3级事件”规范中,规定了以下几类事件: UI事件    当用户与页面元素交互时触发 焦点事件    当 ...

  6. Django项目settings配置redis连接

    CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", &q ...

  7. build.gradle文件的注释

    Gradle是一种依赖管理工具,基于Froovy语言,面向Java应用为主,它抛弃了基于xml的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言. apply plugin: ...

  8. Python BeautifulSoup 使用

    BS4库简单使用: 1.最好配合LXML库,下载:pip install lxml 2.最好配合Requests库,下载:pip install requests 3.下载bs4:pip instal ...

  9. dubbo实用知识点总结(二)

    1. 参数验证 2. 结果缓存 3. 泛化引用 客户端没有对应接口类的情况,可以直接调用 4. 泛化实现 5. 回声测试 用于检测服务是否可用 6. 上下文信息 7. 隐式传参(不常用) 8. 异步调 ...

  10. VIM简单配置

    配置vim配置 编辑配置文件 feng@mint ~ $ vim ~/.vimrc 配置如下 主要配置为自动换行,设置行号,设置tab键为4个空格,同时将tab键自动转换成空格 set autoind ...