.Net程序随系统开机启动(仿Foxmail托盘效果控制)

简介:

.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.效果图如下:

 


本文转自SanMaoSpace博客园博客,原文链接:http://www.cnblogs.com/SanMaoSpace/p/3775497.html,如需转载请自行联系原作者

 

相关文章
|
4月前
|
前端开发 JavaScript 关系型数据库
使用 OpenAuth.Net 快速搭建 .NET 企业级权限工作流系统
使用 OpenAuth.Net 快速搭建 .NET 企业级权限工作流系统
164 0
|
7月前
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
280 0
|
11月前
|
前端开发 C# 开发者
.NET使用Umbraco CMS快速构建一个属于自己的内容管理系统
.NET使用Umbraco CMS快速构建一个属于自己的内容管理系统
173 12
|
11月前
|
Web App开发 前端开发 调度
一款基于 .NET + Blazor 开发的智能访客管理系统
一款基于 .NET + Blazor 开发的智能访客管理系统
167 8
|
11月前
|
开发框架 JavaScript 前端开发
精选2款.NET开源的博客系统
精选2款.NET开源的博客系统
151 8
|
11月前
|
前端开发 JavaScript C#
基于.NET8+Vue3开发的权限管理&个人博客系统
基于.NET8+Vue3开发的权限管理&个人博客系统
167 7
|
11月前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
531 13
|
12月前
|
开发框架 安全 Java
.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力
本文深入探讨了.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力。.NET不仅支持跨平台开发,具备出色的安全性和稳定性,还能与多种技术无缝集成,为企业级应用提供全面支持。
370 3
|
关系型数据库 C# 数据库
.NET 8.0 开源在线考试系统(支持移动端)
【10月更文挑战第27天】以下是适用于 .NET 8.0 的开源在线考试系统(支持移动端)的简介: 1. **基于 .NET Core**:跨平台,支持多种数据库,前后端分离,适用于多操作系统。 2. **结合 Blazor**:使用 C# 开发 Web 应用,支持响应式设计,优化移动端体验。 3. **基于 .NET MAUI**:跨平台移动应用开发,一套代码多平台运行,提高开发效率。 开发时需关注界面设计、安全性与稳定性。
341 4
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
211 0

热门文章

最新文章