.Net程序随系统开机启动(仿Foxmail托盘效果控制)
对于使.NET程序随系统开机启动,最常用的可能就是向在注册表中注册开机启动项,或是建立Windows服务,使程序随系统启动而启动。
这里以WinForm程序为例,测试Demo分享,同时附上对于程序托盘的简单操作,仿Foxmail的托盘显示效果,好的产品都是细细打磨出来的呀!
1.WinForm程序添加注册表和移除注册表
(1).创建一个WinForm程序,界面如下(很简单):
(2).主要实现代码:(注册表开机启动位置:SOFTWARE\Microsoft\Windows\CurrentVersion\Run)
/// <summary>
/// 根据注册名称和路径判断是否已注册
/// </summary>
/// <param name="regName">注册名称</param>
/// <param name="startUpPath">注册路径</param>
private void IsExistsStartRun(string regName, string startUpPath)
{
string strMessage = "注册已移除!";
RegistryKey loca = Registry.LocalMachine;
RegistryKey run = loca.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); object obj = run.GetValue(regName); if (obj != null)
{
strMessage = "注册已添加!";
ControlBtnEnable(false);
}
else
{
ControlBtnEnable(true);
}
lblInitMsg.Text += strMessage;
} /// <summary>
/// 根据注册名和注册路径,更新注册表信息
/// </summary>
/// <param name="regName">注册名</param>
/// <param name="startUpPath">注册路径</param>
/// <param name="isAddReg">是否添加</param>
private void RegCompStartRun(string regName, string startUpPath, bool isAddReg)
{
//表示Window注册表中项级节点,读取 Windows 注册表基项HKEY_LOCAL_MACHINE
RegistryKey localMachine = Registry.LocalMachine;
RegistryKey run = localMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); try
{
//SetValue:存储值的名称
if (isAddReg)
{
run.SetValue(regName, startUpPath);//加入注册,参数一为注册节点名称(随意)
}
else
{
if (run.GetValue(regName) != null)//存在则移除
{
run.DeleteValue(regName, false);//删除该注册节点
}
}
localMachine.Close();
}
catch (Exception ee)
{
MessageBox.Show(ee.Message.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
重新将改程序注册到注册表中,重启电脑,应该就可以了。博客最后是完整代码实现。
2.程序托盘显示控制
(1).在WinForm程序控件库找到notifyIcon控件,将其加到WinForm程序上面,仿Foxmail的托盘程序控制。
随系统自动启动,最小化为托盘在底部显示;单击托盘图标,显示主体程序,继续单击显示和隐藏;单击主窗体关闭按钮,放到托盘显示,右键退出系统,关闭主体程序。
(2).主要实现代码:
/// <summary>
/// 初始化消息图标的右键菜单
/// </summary>
private void InitNotifyicon()
{
List<MenuItem> listMenu = new List<MenuItem>();
listMenu.Add(new MenuItem("显示主窗口", new EventHandler(this.notifyIcon_ShowFrm)));
listMenu.Add(new MenuItem("-"));
listMenu.Add(new MenuItem("最小化系统", new EventHandler(this.notifyIcon_Minimzed)));
listMenu.Add(new MenuItem("-"));
listMenu.Add(new MenuItem("退出系统", new EventHandler(this.notifyIcon_ExitShow))); this.notifyIcon1.ContextMenu = new ContextMenu(listMenu.ToArray());//消息托盘菜单
} /// <summary>
/// 根据是否显示窗体和是否最小化,控制窗体显示
/// </summary>
/// <param name="isFrmShow">是否显示主窗体</param>
/// <param name="isMinShow">是否为最小化</param>
private void IsShowMainFrm(bool isFrmShow, bool isMinShow)
{
if (!isMinShow)
{
this.Visible = isFrmShow;//显示在屏幕
this.ShowInTaskbar = isFrmShow;//显示在任务栏
this.WindowState = FormWindowState.Normal;
isShowFrm = !isFrmShow;//相反设置
}
else
{
this.Visible = isMinShow;//主窗体可见
this.ShowInTaskbar = isMinShow;//在任务栏显示
isShowFrm = !isFrmShow;//是否显示主窗体控制
this.WindowState = isFrmShow == true ? FormWindowState.Normal : FormWindowState.Minimized;
}
this.isShowMin = isMinShow;//显示最小化控制
}
3.结合对注册表的操作实现随着系统启动自动启动程序;默认显示为托盘图标显示在底部以及一些显示隐藏控制,仿Foxmail的完成代码实现:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Win32; namespace WinFormAutoStart
{
public partial class Form1 : Form
{
private bool isShowMin = false;//默认为最小化
private bool isShowFrm = false;//默认不显示主窗体
private string regName = "TestWinForm";//注册表对应的Name
private string startUpPath = Application.ExecutablePath;//程序执行路径 public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
//注册表操作
IsExistsStartRun(regName, startUpPath); //托盘消息操作
this.Visible = false;//不可见
this.ShowInTaskbar = false;//不显示在系统任务S栏
this.notifyIcon1.Visible = true;
InitNotifyicon();//添加消息图标右键菜单
} #region 注册表相关操作
/// <summary>
/// 控制按钮是否可用
/// </summary>
/// <param name="isAdd">标识是否为添加注册操作</param>
private void ControlBtnEnable(bool isAdd)
{
if (isAdd)
{
this.btnAddReg.Enabled = true;
this.btnDeleteReg.Enabled = false;
}
else
{
this.btnAddReg.Enabled = false;
this.btnDeleteReg.Enabled = true;
}
} /// <summary>
/// 根据注册名称和路径判断是否已注册
/// </summary>
/// <param name="regName">注册名称</param>
/// <param name="startUpPath">注册路径</param>
private void IsExistsStartRun(string regName, string startUpPath)
{
string strMessage = "注册已移除!";
RegistryKey loca = Registry.LocalMachine;
RegistryKey run = loca.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); object obj = run.GetValue(regName); if (obj != null)
{
strMessage = "注册已添加!";
ControlBtnEnable(false);
}
else
{
ControlBtnEnable(true);
}
lblInitMsg.Text += strMessage;
} /// <summary>
/// 根据注册名和注册路径,更新注册表信息
/// </summary>
/// <param name="regName">注册名</param>
/// <param name="startUpPath">注册路径</param>
/// <param name="isAddReg">是否添加</param>
private void RegCompStartRun(string regName, string startUpPath, bool isAddReg)
{
//表示Window注册表中项级节点,读取 Windows 注册表基项HKEY_LOCAL_MACHINE
RegistryKey localMachine = Registry.LocalMachine;
RegistryKey run = localMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); try
{
//SetValue:存储值的名称
if (isAddReg)
{
run.SetValue(regName, startUpPath);//加入注册,参数一为注册节点名称(随意)
}
else
{
if (run.GetValue(regName) != null)//存在则移除
{
run.DeleteValue(regName, false);//删除该注册节点
}
}
localMachine.Close();
}
catch (Exception ee)
{
MessageBox.Show(ee.Message.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
} /// <summary>
/// 添加到注册表
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAddReg_Click(object sender, EventArgs e)
{
//注册 WinForm程序开机启动
string strMessage = "添加程序注册成功!";
RegCompStartRun(regName, startUpPath, true);
lblMessage.Text = strMessage;
ControlBtnEnable(false);
MessageBox.Show(strMessage);
} /// <summary>
/// 从注册表移除
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDeleteReg_Click(object sender, EventArgs e)
{
//注册 WinForm程序开机启动
string strMessage = "移除程序注册成功!";
RegCompStartRun(regName, startUpPath, false);
lblMessage.Text = strMessage;
ControlBtnEnable(true);
MessageBox.Show(strMessage);
}
#endregion #region 消息图标相关操作
/// <summary>
/// 初始化消息图标的右键菜单
/// </summary>
private void InitNotifyicon()
{
List<MenuItem> listMenu = new List<MenuItem>();
listMenu.Add(new MenuItem("显示主窗口", new EventHandler(this.notifyIcon_ShowFrm)));
listMenu.Add(new MenuItem("-"));
listMenu.Add(new MenuItem("最小化系统", new EventHandler(this.notifyIcon_Minimzed)));
listMenu.Add(new MenuItem("-"));
listMenu.Add(new MenuItem("退出系统", new EventHandler(this.notifyIcon_ExitShow))); this.notifyIcon1.ContextMenu = new ContextMenu(listMenu.ToArray());//消息托盘菜单
} /// <summary>
/// 根据是否显示窗体和是否最小化,控制窗体显示
/// </summary>
/// <param name="isFrmShow">是否显示主窗体</param>
/// <param name="isMinShow">是否为最小化</param>
private void IsShowMainFrm(bool isFrmShow, bool isMinShow)
{
if (!isMinShow)
{
this.Visible = isFrmShow;//显示在屏幕
this.ShowInTaskbar = isFrmShow;//显示在任务栏
this.WindowState = FormWindowState.Normal;
isShowFrm = !isFrmShow;//相反设置
}
else
{
this.Visible = isMinShow;//主窗体可见
this.ShowInTaskbar = isMinShow;//在任务栏显示
isShowFrm = !isFrmShow;//是否显示主窗体控制
this.WindowState = isFrmShow == true ? FormWindowState.Normal : FormWindowState.Minimized;
}
this.isShowMin = isMinShow;//显示最小化控制
} /// <summary>
/// 右键菜单显示主窗体事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void notifyIcon_ShowFrm(object sender, System.EventArgs e)
{
IsShowMainFrm(true, false);
} /// <summary>
/// 右键菜单退出系统事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void notifyIcon_ExitShow(object sender, EventArgs e)
{
notifyIcon1.Visible = false;//图标可不见
notifyIcon1.Dispose();
this.Close();//关闭窗体
this.Dispose();//释放资源
} /// <summary>
/// 右键菜单最小化事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void notifyIcon_Minimzed(object sender, EventArgs e)
{
IsShowMainFrm(false, true);
} /// <summary>
/// 监视窗体大小改变事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_SizeChanged(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
IsShowMainFrm(false, true);
}
} /// <summary>
/// 窗体正在关闭事件
/// 自动放置到托盘
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
IsShowMainFrm(false, false);
e.Cancel = true;//取消关闭操作
} /// <summary>
/// 消息点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
{
IsShowMainFrm(isShowFrm, isShowMin);//控制主窗体是否显示
}
#endregion
}
}
4.效果图如下:
.Net程序随系统开机启动(仿Foxmail托盘效果控制)的更多相关文章
- Linux系统开机启动时的工作原理
Linux系统开机启动时的工作原理也是深入了解Linux系统核心工作原理的一个很好的途径. 启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至 ...
- Linux 系统开机启动项清理
一般情况下,常规用途的 Linux 发行版在开机启动时拉起各种相关服务进程,包括许多你可能无需使用的服务,例如蓝牙bluetooth.Avahi. 调制解调管理器ModemManager.ppp-dn ...
- win10应用程序添加到开机启动项的两种解决办法
原文 win10应用程序添加到开机启动项的两种解决办法 在windows10系统中,如果想让应用程序在开机之后自动运行起来,可以怎么做呢? 方法一: 1.首先创建应用程序的快捷方式 找到自己想加入开机 ...
- 原创:四种Linux系统开机启动项优命令超给力超详细详解
老葵花哥哥又开课了 接下来是你们的齐天大圣孙悟空给你们带来的详细版Linux系统开机启动优化四种命令 第一种方法是很正常的 第二种有点难理解 第三种来自我的一个奇思妙想 本文档秉承 不要钱也不要臀部的 ...
- 利用系统函数模拟实现nginx 系统脚本启动的特殊颜色专业效果
利用系统函数模拟实现nginx 系统脚本启动的特殊颜色专业效果/etc/init.d/nginxd {start/stop/restart/reload}利用if语句实现: ============= ...
- Android系统开机启动画面显示过程简要说明
开机启动会显示三个画面: Linux内核的启动画面,静态画面 Init进程启动过程中出现的静态画面 系统服务启动过程中出现的动态画面 这些画面的显示的过程不同,但最终是通过framebuffer显示的 ...
- Linux系统开机启动流程
(来源学习Linux时,自己做的笔记) Linux系统有7个运行级别(runlevel)运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动运行级别1:单用户工作状态,root权限, ...
- Android系统开机启动流程及init进程浅析
Android系统启动概述 Android系统开机流程基于Linux系统,总体可分为三个阶段: Boot Loader引导程序启动Linux内核启动Android系统启动,Launcher/app启动 ...
- 在树莓派上运行 .net core 2.1 程序 并实现开机启动
本篇文章完整的说明如和在树莓派上运行 .net core2.1程序,当然也参考了其他的博客,此处结合我自己的经验,再写一篇完整的博客,方便大家,还有我自己进行查阅. https://blog.csdn ...
随机推荐
- Sersync + Rsync 代码分发
简介: Sersync 是基于 inotify 来编写的 Linux 系统文件监控工具,当监控到文件发生变化时,调用 rsync 同步文件. 类似的功能,以前有用 rsync + inotify 实现 ...
- ubuntu 桥接备忘
apt install birdge-utils 用于桥接网卡的工具,如命令brctl root@ubuntu:/etc/network# vim interfaces auto br0 ...
- objective-C中的"非正式协议"和“正式协议”
objective-C中的接口与泛型 先承认我是标题党,因为在obj-c的世界中,官方根本没有"接口"与"泛型"这样的说法. 不过在obj-c中有二个与之接近的 ...
- NSTimer类的使用
转载于:http://www.cnblogs.com/wujian1360/archive/2011/09/05/2167992.html 创建一个 Timer + scheduledTimerWit ...
- 【原】Coursera—Andrew Ng机器学习—Week 7 习题—支持向量机SVM
[1] [2] Answer: B. 即 x1=3这条垂直线. [3] Answer: B 因为要尽可能小.对B,右侧红叉,有1/2 * 2 = 1 ≥ 1,左侧圆圈,有1/2 * -2 = -1 ...
- MySQL数据库篇之索引原理与慢查询优化之一
主要内容: 一.索引的介绍 二.索引的原理 三.索引的数据结构 四.聚集索引与辅助索引 五.MySQL索引管理 六.测试索引 七.正确使用索引 八.联合索引与覆盖索引 九.查询优化神器--explai ...
- FreeSWITCH--配置代接电话
配置代接电话,需要更改 分机.拨号计划.外线 的配置 一.配置分机 代接组内分机的这个“组”, 不是“conf/directory/default.xml"中配置的 group,而是要在分机 ...
- java求最长公共子串的长度
1这道题目就是给定两个字符串,然后求这两个字符串的最长公共子串的最大长度,假设我的f()方法是来求两个字符串的最大公共子串,从头开始逐一比较,如果相等,则 继续调用这个方法,使得递归的长度+1,如果不 ...
- Unity3d 下websocket的使用
今天介绍一下如何在Unity3D下使用WebSocket. 首先介绍一下什么是websocket,以及与socket,和http的区别与联系,然后介绍一下websocket的一些开源的项目. WebS ...
- Codeforces 76D 位运算
题意:给你两个数x 和 y, x = a + b, y = a XOR b,问有没有合法的a和b满足这个等式? 思路:有恒等式: a + b = ((a & b) << 1) + ...