博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net程序随系统开机启动(仿Foxmail托盘效果控制)
阅读量:6976 次
发布时间:2019-06-27

本文共 10539 字,大约阅读时间需要 35 分钟。

对于使.NET程序随系统开机启动,最常用的可能就是向在注册表中注册开机启动项,或是建立Windows服务,使程序随系统启动而启动

这里以WinForm程序为例,测试Demo分享,同时附上对于程序托盘的简单操作,仿Foxmail的托盘显示效果,好的产品都是细细打磨出来的呀!
1.WinForm程序添加注册表和移除注册表
(1).创建一个WinForm程序,界面如下(很简单):
(2).主要实现代码:(注册表开机启动位置:SOFTWARE\Microsoft\Windows\CurrentVersion\Run)

///         /// 根据注册名称和路径判断是否已注册        ///         /// 注册名称        /// 注册路径        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;        }        ///         /// 根据注册名和注册路径,更新注册表信息        ///         /// 注册名        /// 注册路径        /// 是否添加        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).主要实现代码:

///         /// 初始化消息图标的右键菜单        ///         private void InitNotifyicon()        {            List listMenu = new List();            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());//消息托盘菜单        }        ///         /// 根据是否显示窗体和是否最小化,控制窗体显示        ///         /// 是否显示主窗体        /// 是否为最小化        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 注册表相关操作        ///         /// 控制按钮是否可用        ///         /// 标识是否为添加注册操作        private void ControlBtnEnable(bool isAdd)        {            if (isAdd)            {                this.btnAddReg.Enabled = true;                this.btnDeleteReg.Enabled = false;            }            else            {                this.btnAddReg.Enabled = false;                this.btnDeleteReg.Enabled = true;            }        }        ///         /// 根据注册名称和路径判断是否已注册        ///         /// 注册名称        /// 注册路径        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;        }        ///         /// 根据注册名和注册路径,更新注册表信息        ///         /// 注册名        /// 注册路径        /// 是否添加        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);            }        }        ///         /// 添加到注册表        ///         ///         ///         private void btnAddReg_Click(object sender, EventArgs e)        {            //注册 WinForm程序开机启动            string strMessage = "添加程序注册成功!";            RegCompStartRun(regName, startUpPath, true);            lblMessage.Text = strMessage;            ControlBtnEnable(false);            MessageBox.Show(strMessage);        }        ///         /// 从注册表移除        ///         ///         ///         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 消息图标相关操作        ///         /// 初始化消息图标的右键菜单        ///         private void InitNotifyicon()        {            List listMenu = new List();            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());//消息托盘菜单        }        ///         /// 根据是否显示窗体和是否最小化,控制窗体显示        ///         /// 是否显示主窗体        /// 是否为最小化        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;//显示最小化控制        }        ///         /// 右键菜单显示主窗体事件        ///         ///         ///         private void notifyIcon_ShowFrm(object sender, System.EventArgs e)        {            IsShowMainFrm(true, false);        }        ///         /// 右键菜单退出系统事件        ///         ///         ///         private void notifyIcon_ExitShow(object sender, EventArgs e)        {            notifyIcon1.Visible = false;//图标可不见            notifyIcon1.Dispose();            this.Close();//关闭窗体            this.Dispose();//释放资源        }        ///         /// 右键菜单最小化事件        ///         ///         ///         private void notifyIcon_Minimzed(object sender, EventArgs e)        {            IsShowMainFrm(false, true);        }        ///         /// 监视窗体大小改变事件        ///         ///         ///         private void Form1_SizeChanged(object sender, EventArgs e)        {            if (this.WindowState == FormWindowState.Minimized)            {                IsShowMainFrm(false, true);            }        }        ///         /// 窗体正在关闭事件        /// 自动放置到托盘        ///         ///         ///         private void Form1_FormClosing(object sender, FormClosingEventArgs e)        {            IsShowMainFrm(false, false);            e.Cancel = true;//取消关闭操作        }        ///         /// 消息点击事件        ///         ///         ///         private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)        {            IsShowMainFrm(isShowFrm, isShowMin);//控制主窗体是否显示        }        #endregion    }}

4.效果图如下:

 

 

转载于:https://www.cnblogs.com/SanMaoSpace/p/3775497.html

你可能感兴趣的文章
[Linux] ubuntu 格式化u盘
查看>>
一个COM示例程序
查看>>
通过改进算法来优化程序性能的真实案例(Ransac)
查看>>
head命令
查看>>
软件开发经验总结(一)细节决定软件的成败
查看>>
python tar.gz格式压缩、解压
查看>>
JNDI概述(转载)
查看>>
利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
查看>>
第 7 章 项目运作
查看>>
PYTHON黑帽编程1.5 使用WIRESHARK练习网络协议分析
查看>>
.NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator
查看>>
C# 格式串(收藏)
查看>>
浅谈SQL Server中统计对于查询的影响
查看>>
WF4 Beta,RC版文章总结
查看>>
WPF 与Surface 2.0 SDK 亲密接触–LibraryContainer 篇
查看>>
C# 对应 Oracle 存储过程 的 SYS_REFCURSOR 应该 传入什么类型的参数?
查看>>
Unity3D移植到自己的Android程序
查看>>
【转】用示例说明索引数据块中出现热块的场景,并给出解决方案
查看>>
HDU 2034 人见人爱A-B
查看>>
【AngularJS】—— 12 独立作用域
查看>>