对于使.NET程序随系统开机启动,最常用的可能就是向在注册表中注册开机启动项,或是建立Windows服务,使程序随系统启动而启动。
这里以WinForm程序为例,测试Demo分享,同时附上对于程序托盘的简单操作,仿Foxmail的托盘显示效果,好的产品都是细细打磨出来的呀!

1.WinForm程序添加注册表和移除注册表
(1).创建一个WinForm程序,界面如下(很简单):

(2).主要实现代码:(注册表开机启动位置:SOFTWARE\Microsoft\Windows\CurrentVersion\Run)

  1. /// <summary>
  2. /// 根据注册名称和路径判断是否已注册
  3. /// </summary>
  4. /// <param name="regName">注册名称</param>
  5. /// <param name="startUpPath">注册路径</param>
  6. private void IsExistsStartRun(string regName, string startUpPath)
  7. {
  8. string strMessage = "注册已移除!";
  9. RegistryKey loca = Registry.LocalMachine;
  10. RegistryKey run = loca.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
  11.  
  12. object obj = run.GetValue(regName);
  13.  
  14. if (obj != null)
  15. {
  16. strMessage = "注册已添加!";
  17. ControlBtnEnable(false);
  18. }
  19. else
  20. {
  21. ControlBtnEnable(true);
  22. }
  23. lblInitMsg.Text += strMessage;
  24. }
  25.  
  26. /// <summary>
  27. /// 根据注册名和注册路径,更新注册表信息
  28. /// </summary>
  29. /// <param name="regName">注册名</param>
  30. /// <param name="startUpPath">注册路径</param>
  31. /// <param name="isAddReg">是否添加</param>
  32. private void RegCompStartRun(string regName, string startUpPath, bool isAddReg)
  33. {
  34. //表示Window注册表中项级节点,读取 Windows 注册表基项HKEY_LOCAL_MACHINE
  35. RegistryKey localMachine = Registry.LocalMachine;
  36. RegistryKey run = localMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
  37.  
  38. try
  39. {
  40. //SetValue:存储值的名称
  41. if (isAddReg)
  42. {
  43. run.SetValue(regName, startUpPath);//加入注册,参数一为注册节点名称(随意)
  44. }
  45. else
  46. {
  47. if (run.GetValue(regName) != null)//存在则移除
  48. {
  49. run.DeleteValue(regName, false);//删除该注册节点
  50. }
  51. }
  52. localMachine.Close();
  53. }
  54. catch (Exception ee)
  55. {
  56. MessageBox.Show(ee.Message.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
  57. }
  58. }

重新将改程序注册到注册表中,重启电脑,应该就可以了。博客最后是完整代码实现。
2.程序托盘显示控制
(1).在WinForm程序控件库找到notifyIcon控件,将其加到WinForm程序上面,仿Foxmail的托盘程序控制。
随系统自动启动,最小化为托盘在底部显示;单击托盘图标,显示主体程序,继续单击显示和隐藏;单击主窗体关闭按钮,放到托盘显示,右键退出系统,关闭主体程序。
(2).主要实现代码:

  1. /// <summary>
  2. /// 初始化消息图标的右键菜单
  3. /// </summary>
  4. private void InitNotifyicon()
  5. {
  6. List<MenuItem> listMenu = new List<MenuItem>();
  7. listMenu.Add(new MenuItem("显示主窗口", new EventHandler(this.notifyIcon_ShowFrm)));
  8. listMenu.Add(new MenuItem("-"));
  9. listMenu.Add(new MenuItem("最小化系统", new EventHandler(this.notifyIcon_Minimzed)));
  10. listMenu.Add(new MenuItem("-"));
  11. listMenu.Add(new MenuItem("退出系统", new EventHandler(this.notifyIcon_ExitShow)));
  12.  
  13. this.notifyIcon1.ContextMenu = new ContextMenu(listMenu.ToArray());//消息托盘菜单
  14. }
  15.  
  16. /// <summary>
  17. /// 根据是否显示窗体和是否最小化,控制窗体显示
  18. /// </summary>
  19. /// <param name="isFrmShow">是否显示主窗体</param>
  20. /// <param name="isMinShow">是否为最小化</param>
  21. private void IsShowMainFrm(bool isFrmShow, bool isMinShow)
  22. {
  23. if (!isMinShow)
  24. {
  25. this.Visible = isFrmShow;//显示在屏幕
  26. this.ShowInTaskbar = isFrmShow;//显示在任务栏
  27. this.WindowState = FormWindowState.Normal;
  28. isShowFrm = !isFrmShow;//相反设置
  29. }
  30. else
  31. {
  32. this.Visible = isMinShow;//主窗体可见
  33. this.ShowInTaskbar = isMinShow;//在任务栏显示
  34. isShowFrm = !isFrmShow;//是否显示主窗体控制
  35. this.WindowState = isFrmShow == true ? FormWindowState.Normal : FormWindowState.Minimized;
  36. }
  37. this.isShowMin = isMinShow;//显示最小化控制
  38. }

3.结合对注册表的操作实现随着系统启动自动启动程序;默认显示为托盘图标显示在底部以及一些显示隐藏控制,仿Foxmail的完成代码实现:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using Microsoft.Win32;
  11.  
  12. namespace WinFormAutoStart
  13. {
  14. public partial class Form1 : Form
  15. {
  16. private bool isShowMin = false;//默认为最小化
  17. private bool isShowFrm = false;//默认不显示主窗体
  18. private string regName = "TestWinForm";//注册表对应的Name
  19. private string startUpPath = Application.ExecutablePath;//程序执行路径
  20.  
  21. public Form1()
  22. {
  23. InitializeComponent();
  24. }
  25.  
  26. private void Form1_Load(object sender, EventArgs e)
  27. {
  28. //注册表操作
  29. IsExistsStartRun(regName, startUpPath);
  30.  
  31. //托盘消息操作
  32. this.Visible = false;//不可见
  33. this.ShowInTaskbar = false;//不显示在系统任务S栏
  34. this.notifyIcon1.Visible = true;
  35. InitNotifyicon();//添加消息图标右键菜单
  36. }
  37.  
  38. #region 注册表相关操作
  39. /// <summary>
  40. /// 控制按钮是否可用
  41. /// </summary>
  42. /// <param name="isAdd">标识是否为添加注册操作</param>
  43. private void ControlBtnEnable(bool isAdd)
  44. {
  45. if (isAdd)
  46. {
  47. this.btnAddReg.Enabled = true;
  48. this.btnDeleteReg.Enabled = false;
  49. }
  50. else
  51. {
  52. this.btnAddReg.Enabled = false;
  53. this.btnDeleteReg.Enabled = true;
  54. }
  55. }
  56.  
  57. /// <summary>
  58. /// 根据注册名称和路径判断是否已注册
  59. /// </summary>
  60. /// <param name="regName">注册名称</param>
  61. /// <param name="startUpPath">注册路径</param>
  62. private void IsExistsStartRun(string regName, string startUpPath)
  63. {
  64. string strMessage = "注册已移除!";
  65. RegistryKey loca = Registry.LocalMachine;
  66. RegistryKey run = loca.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
  67.  
  68. object obj = run.GetValue(regName);
  69.  
  70. if (obj != null)
  71. {
  72. strMessage = "注册已添加!";
  73. ControlBtnEnable(false);
  74. }
  75. else
  76. {
  77. ControlBtnEnable(true);
  78. }
  79. lblInitMsg.Text += strMessage;
  80. }
  81.  
  82. /// <summary>
  83. /// 根据注册名和注册路径,更新注册表信息
  84. /// </summary>
  85. /// <param name="regName">注册名</param>
  86. /// <param name="startUpPath">注册路径</param>
  87. /// <param name="isAddReg">是否添加</param>
  88. private void RegCompStartRun(string regName, string startUpPath, bool isAddReg)
  89. {
  90. //表示Window注册表中项级节点,读取 Windows 注册表基项HKEY_LOCAL_MACHINE
  91. RegistryKey localMachine = Registry.LocalMachine;
  92. RegistryKey run = localMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
  93.  
  94. try
  95. {
  96. //SetValue:存储值的名称
  97. if (isAddReg)
  98. {
  99. run.SetValue(regName, startUpPath);//加入注册,参数一为注册节点名称(随意)
  100. }
  101. else
  102. {
  103. if (run.GetValue(regName) != null)//存在则移除
  104. {
  105. run.DeleteValue(regName, false);//删除该注册节点
  106. }
  107. }
  108. localMachine.Close();
  109. }
  110. catch (Exception ee)
  111. {
  112. MessageBox.Show(ee.Message.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
  113. }
  114. }
  115.  
  116. /// <summary>
  117. /// 添加到注册表
  118. /// </summary>
  119. /// <param name="sender"></param>
  120. /// <param name="e"></param>
  121. private void btnAddReg_Click(object sender, EventArgs e)
  122. {
  123. //注册 WinForm程序开机启动
  124. string strMessage = "添加程序注册成功!";
  125. RegCompStartRun(regName, startUpPath, true);
  126. lblMessage.Text = strMessage;
  127. ControlBtnEnable(false);
  128. MessageBox.Show(strMessage);
  129. }
  130.  
  131. /// <summary>
  132. /// 从注册表移除
  133. /// </summary>
  134. /// <param name="sender"></param>
  135. /// <param name="e"></param>
  136. private void btnDeleteReg_Click(object sender, EventArgs e)
  137. {
  138. //注册 WinForm程序开机启动
  139. string strMessage = "移除程序注册成功!";
  140. RegCompStartRun(regName, startUpPath, false);
  141. lblMessage.Text = strMessage;
  142. ControlBtnEnable(true);
  143. MessageBox.Show(strMessage);
  144. }
  145. #endregion
  146.  
  147. #region 消息图标相关操作
  148. /// <summary>
  149. /// 初始化消息图标的右键菜单
  150. /// </summary>
  151. private void InitNotifyicon()
  152. {
  153. List<MenuItem> listMenu = new List<MenuItem>();
  154. listMenu.Add(new MenuItem("显示主窗口", new EventHandler(this.notifyIcon_ShowFrm)));
  155. listMenu.Add(new MenuItem("-"));
  156. listMenu.Add(new MenuItem("最小化系统", new EventHandler(this.notifyIcon_Minimzed)));
  157. listMenu.Add(new MenuItem("-"));
  158. listMenu.Add(new MenuItem("退出系统", new EventHandler(this.notifyIcon_ExitShow)));
  159.  
  160. this.notifyIcon1.ContextMenu = new ContextMenu(listMenu.ToArray());//消息托盘菜单
  161. }
  162.  
  163. /// <summary>
  164. /// 根据是否显示窗体和是否最小化,控制窗体显示
  165. /// </summary>
  166. /// <param name="isFrmShow">是否显示主窗体</param>
  167. /// <param name="isMinShow">是否为最小化</param>
  168. private void IsShowMainFrm(bool isFrmShow, bool isMinShow)
  169. {
  170. if (!isMinShow)
  171. {
  172. this.Visible = isFrmShow;//显示在屏幕
  173. this.ShowInTaskbar = isFrmShow;//显示在任务栏
  174. this.WindowState = FormWindowState.Normal;
  175. isShowFrm = !isFrmShow;//相反设置
  176. }
  177. else
  178. {
  179. this.Visible = isMinShow;//主窗体可见
  180. this.ShowInTaskbar = isMinShow;//在任务栏显示
  181. isShowFrm = !isFrmShow;//是否显示主窗体控制
  182. this.WindowState = isFrmShow == true ? FormWindowState.Normal : FormWindowState.Minimized;
  183. }
  184. this.isShowMin = isMinShow;//显示最小化控制
  185. }
  186.  
  187. /// <summary>
  188. /// 右键菜单显示主窗体事件
  189. /// </summary>
  190. /// <param name="sender"></param>
  191. /// <param name="e"></param>
  192. private void notifyIcon_ShowFrm(object sender, System.EventArgs e)
  193. {
  194. IsShowMainFrm(true, false);
  195. }
  196.  
  197. /// <summary>
  198. /// 右键菜单退出系统事件
  199. /// </summary>
  200. /// <param name="sender"></param>
  201. /// <param name="e"></param>
  202. private void notifyIcon_ExitShow(object sender, EventArgs e)
  203. {
  204. notifyIcon1.Visible = false;//图标可不见
  205. notifyIcon1.Dispose();
  206. this.Close();//关闭窗体
  207. this.Dispose();//释放资源
  208. }
  209.  
  210. /// <summary>
  211. /// 右键菜单最小化事件
  212. /// </summary>
  213. /// <param name="sender"></param>
  214. /// <param name="e"></param>
  215. private void notifyIcon_Minimzed(object sender, EventArgs e)
  216. {
  217. IsShowMainFrm(false, true);
  218. }
  219.  
  220. /// <summary>
  221. /// 监视窗体大小改变事件
  222. /// </summary>
  223. /// <param name="sender"></param>
  224. /// <param name="e"></param>
  225. private void Form1_SizeChanged(object sender, EventArgs e)
  226. {
  227. if (this.WindowState == FormWindowState.Minimized)
  228. {
  229. IsShowMainFrm(false, true);
  230. }
  231. }
  232.  
  233. /// <summary>
  234. /// 窗体正在关闭事件
  235. /// 自动放置到托盘
  236. /// </summary>
  237. /// <param name="sender"></param>
  238. /// <param name="e"></param>
  239. private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  240. {
  241. IsShowMainFrm(false, false);
  242. e.Cancel = true;//取消关闭操作
  243. }
  244.  
  245. /// <summary>
  246. /// 消息点击事件
  247. /// </summary>
  248. /// <param name="sender"></param>
  249. /// <param name="e"></param>
  250. private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
  251. {
  252. IsShowMainFrm(isShowFrm, isShowMin);//控制主窗体是否显示
  253. }
  254. #endregion
  255. }
  256. }

4.效果图如下:

.Net程序随系统开机启动(仿Foxmail托盘效果控制)的更多相关文章

  1. Linux系统开机启动时的工作原理

    Linux系统开机启动时的工作原理也是深入了解Linux系统核心工作原理的一个很好的途径. 启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至 ...

  2. Linux 系统开机启动项清理

    一般情况下,常规用途的 Linux 发行版在开机启动时拉起各种相关服务进程,包括许多你可能无需使用的服务,例如蓝牙bluetooth.Avahi. 调制解调管理器ModemManager.ppp-dn ...

  3. win10应用程序添加到开机启动项的两种解决办法

    原文 win10应用程序添加到开机启动项的两种解决办法 在windows10系统中,如果想让应用程序在开机之后自动运行起来,可以怎么做呢? 方法一: 1.首先创建应用程序的快捷方式 找到自己想加入开机 ...

  4. 原创:四种Linux系统开机启动项优命令超给力超详细详解

    老葵花哥哥又开课了 接下来是你们的齐天大圣孙悟空给你们带来的详细版Linux系统开机启动优化四种命令 第一种方法是很正常的 第二种有点难理解 第三种来自我的一个奇思妙想 本文档秉承 不要钱也不要臀部的 ...

  5. 利用系统函数模拟实现nginx 系统脚本启动的特殊颜色专业效果

    利用系统函数模拟实现nginx 系统脚本启动的特殊颜色专业效果/etc/init.d/nginxd {start/stop/restart/reload}利用if语句实现: ============= ...

  6. Android系统开机启动画面显示过程简要说明

    开机启动会显示三个画面: Linux内核的启动画面,静态画面 Init进程启动过程中出现的静态画面 系统服务启动过程中出现的动态画面 这些画面的显示的过程不同,但最终是通过framebuffer显示的 ...

  7. Linux系统开机启动流程

    (来源学习Linux时,自己做的笔记) Linux系统有7个运行级别(runlevel)运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动运行级别1:单用户工作状态,root权限, ...

  8. Android系统开机启动流程及init进程浅析

    Android系统启动概述 Android系统开机流程基于Linux系统,总体可分为三个阶段: Boot Loader引导程序启动Linux内核启动Android系统启动,Launcher/app启动 ...

  9. 在树莓派上运行 .net core 2.1 程序 并实现开机启动

    本篇文章完整的说明如和在树莓派上运行 .net core2.1程序,当然也参考了其他的博客,此处结合我自己的经验,再写一篇完整的博客,方便大家,还有我自己进行查阅. https://blog.csdn ...

随机推荐

  1. Latex编译后Yap查看报错Not all fonts could be loaded

    在用Latex写中文大论文时,编译后,用Yap查看DVI文件,打开时,Yap报错: "Not all fonts could be loaded. See 'File->Documen ...

  2. 5.Redis 发布订阅

    转自:http://www.runoob.com/redis/redis-tutorial.html Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub ...

  3. 表单元素(控件)不可见,你用visibility还是display?(转)

    属性大比拼:visibility和display的介绍 今天在做一个表单时涉及到这方面,当选中相应的选项后设置相应的几个元素(控件可见或不可见),后来还是用了visibility来实现.我们先来看下v ...

  4. 【308】Python os.path 模块常用方法

    参考:Python os.path 模块 参考:python3中,os.path模块下常用的用法总结 01   abspath 返回一个目录的绝对路径. 02   basename 返回一个目录的基名 ...

  5. Linux服务管理 systemctl命令详解

    Linux服务器,服务管理--systemctl命令详解,设置开机自启动 syetemclt就是service和chkconfig这两个命令的整合     任务 旧指令 新指令 使某服务自动启动 ch ...

  6. Linux常用命令----基本文件系统常用命令

    1.查看当前工作目录---pwd sunny@sunny-ThinkPad-T450:~$ pwd /home/sunny sunny@sunny-ThinkPad-T450:~$ cd Worksp ...

  7. Kafka Zookeeper 基本命令示例

    Kafka 新建Topic bin/kafka-topics. --replication-factor --partitions --topic my-topic 查看已存在Topic列表 bin/ ...

  8. Excel VBA入门(五)Excel对象操作

    本章是本系列教程的重点.但我觉得应该不是难点.从第零章开始到学完本章,应该可以把VBA用于实战中了. Excel对象主要有4个: 工作薄 Workbook 工作表 Worksheet 单元格区域 Ra ...

  9. [poj2104]kth-number(归并树求区间第k大)

    复杂度:$O(nlog^3n)$ #include<cstdio> #include<cstring> #include<algorithm> #include&l ...

  10. iOS单选和全选

    在日常开发中单选.多选.全选经常遇到,所以写一个demo放上来供大家参考, 先看效果图: Demo地址:https://github.com/domanc/SingleAndAllSelect.git