首页 > 编程语言 >C#实现 Winform 程序在系统托盘显示图标及开机自启动

C#实现 Winform 程序在系统托盘显示图标及开机自启动

时间:2025-01-11 17:46:23浏览次数:1  
标签:控件 sender notifyIcon C# 系统托盘 private 自启动 new void

目录

实现步骤

  • 创建 NotifyIcon 控件并设置属性;
  • 编写 NotifyIcon 响应控制事件;
  • 在主窗体的Load事件中将 NotifyIcon 添加到系统托盘;
  • 程序退出时,移除系统托盘的 NotifyIcon;

NotifyIcon 控件,通常用于在系统托盘中显示图标,通过使用它就可以我们想要的效果。

属性描述
Icon在系统托盘中显示的图标
Text鼠标悬停在图标时显示的文本
Visible指定是否可见

常用方法

方法描述
ShowContextMenu在系统托盘上下文菜单中显示指定的菜单

添加控件(拖拽方式)

将NotifyIcon和一个ContextMenuStrip控件。拖到主窗体中可以修改控件名称

  • NotifyIcon 托盘图标
  • ContextMenuStrip 托盘图标右击弹出的菜单
    image

设置控件

点击 ContextMenuStrip 右上方的三角图标 -> 编辑项,弹出项信合编辑器
添加右健菜单信息
image

添加主窗体事件

在最小化或关闭主窗体时,显示在任务栏托盘区域,实现了单击关闭时,不真正关闭程序,而是将主界面隐藏HIDE掉,同时开始显示托盘菜单。
image

//  只有Form_Closing事件中 e.Cancel可以用。
//  你的是Form_Closed事件。 Form_Closed事件时窗口已关了 ,Cancel没用了;
//  Form_Closing是窗口即将关闭时询问你是不是真的关闭才有Cancel事件

private void MainWindow_FormClosing(object sender, FormClosingEventArgs e)
{

    // 注意判断关闭事件reason来源于窗体按钮,否则用菜单退出时无法退出!
    if (e.CloseReason == CloseReason.UserClosing)
    {
        //取消"关闭窗口"事件
        e.Cancel = true; // 取消关闭窗体 

        //使关闭时窗口向右下角缩小的效果
        this.WindowState = FormWindowState.Minimized;
        this.mainNotifyIcon.Visible = true;
        //this.m_cartoonForm.CartoonClose();
        this.Hide();
        return;
    }
}

实现双击托盘打开主程序

//  添加托盘程序
//  版本更新自1.0.1
private void mainNotifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
    if (this.Visible)
    {
        this.WindowState = FormWindowState.Minimized;
        this.mainNotifyIcon.Visible = true;
        this.Hide();
    }
    else
    {
        this.Visible = true;
        this.WindowState = FormWindowState.Normal;
        this.Activate();
    }
}

//  添加托盘程序右键菜单项
//  版本更新自1.0.1
//  退出
//  添加日期 --  2015-07-29 21:44
private async void toolStripMenuItemQuit_Click(object sender, EventArgs e)
{
    if (MessageBox.Show("你确定要退出?", "系统提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1) == DialogResult.Yes)
    {

        this.mainNotifyIcon.Visible = false;
        this.Close();
        this.Dispose();
        System.Environment.Exit(System.Environment.ExitCode);   

    }
}

代码方式添加

using System;
using System.Windows.Forms;


namespace Fountain.WinForm.NotifyDemo
{
    public partial class FormMain : Form
    {
        /// <summary>
        /// 通知控件
        /// </summary>
        private NotifyIcon notifyIcon = new NotifyIcon();
        /// <summary>
        /// 通知控件显示菜单
        /// </summary>
        private ContextMenuStrip contextMenuStrip = new ContextMenuStrip();
        /// <summary>
        /// 构造方法
        /// </summary>
        public FormMain()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 窗体加载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FormMain_Load(object sender, EventArgs e)
        {
            this.InitializeNotifyMenu();
            this.notifyIcon.Text = this.Text;
            this.notifyIcon.Visible = true;
            this.notifyIcon.Icon = this.Icon;
            this.notifyIcon.ContextMenuStrip = this.contextMenuStrip;
            this.notifyIcon.DoubleClick += notifyIcon_DoubleClick;
        }
        /// <summary>
        /// 托盘菜单
        /// </summary>
        private void InitializeNotifyMenu()
        {
            try
            {
                contextMenuStrip.Items.Clear();
                ToolStripMenuItem showMenuItem = new ToolStripMenuItem("显示界面");
                showMenuItem.Tag = "显示";
                showMenuItem.Click += new EventHandler(ShowMenuItem_Click);
                contextMenuStrip.Items.Add(showMenuItem);


                ToolStripMenuItem sboutMenuItem = new ToolStripMenuItem("关于");
                sboutMenuItem.Tag = "关于";
                sboutMenuItem.Click += new EventHandler(AboutMenuItem_Click);
                contextMenuStrip.Items.Add(sboutMenuItem);


                ToolStripMenuItem exitMenuItem = new ToolStripMenuItem("退出");
                exitMenuItem.Tag = "退出";
                exitMenuItem.Click += new EventHandler(ExistMenuItem_Click);
                contextMenuStrip.Items.Add(exitMenuItem);
            }
            catch(Exception exception) 
            {
                throw new Exception(exception.Message);
            }
        }
        /// <summary>
        /// 右击任务栏图标
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void notifyIcon_DoubleClick(object sender, EventArgs e)
        {
            try
            {
                if (this.WindowState == FormWindowState.Normal)
                {
                    this.WindowState = FormWindowState.Minimized;
                    this.Hide();
                }
                else if (this.WindowState == FormWindowState.Minimized)
                {
                    this.Show();
                    this.WindowState = FormWindowState.Normal;
                    this.Activate();
                }
            }
            catch (Exception objException)
            {
                throw new Exception(objException.Message);
            }
        }
        /// <summary>
        /// 显示
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ShowMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                this.Show();
                this.WindowState = FormWindowState.Normal;
                this.Activate();
            }
            catch (Exception objException)
            {
                throw new Exception(objException.Message);
            }
        }
        /// <summary>
        /// 关于
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void AboutMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
            }
            catch (Exception objException)
            {
                MessageBox.Show(objException.Message);
            }
        }
        /// <summary>
        /// 退出
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ExistMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (MessageBox.Show("你确定要退出程序吗?","提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
                {
                    this.notifyIcon.Visible = false;
                    this.notifyIcon.Dispose();
                    this.Dispose();
                    Application.Exit();
                }
            }
            catch (Exception objException)
            {
                MessageBox.Show(objException.Message);
            }
        }
        /// <summary>
        /// 主窗体关闭
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                e.Cancel = true;
                this.Hide();
                this.notifyIcon.Dispose();
            }
            catch (Exception objException)
            {
                MessageBox.Show(objException.Message);
            }
        }
        /// <summary>
        /// 窗体大小变化
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FormMain_Resize(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Minimized)
            {
                this.ShowInTaskbar = false;
                this.Hide();
                this.notifyIcon.Visible = true;
            }
        }
    }
}

系统开机自启动应用程序

using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.Windows.Forms;


namespace Fountain.WinForm.NotifyDemo
{
    public partial class FormMain : Form
    {
        /// <summary>
        /// 构造方法
        /// </summary>
        public FormMain()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 窗体加载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FormMain_Load(object sender, EventArgs e)
        { 
            string applictionName = Process.GetCurrentProcess().MainModule.ModuleName;
            string applictionPath = Process.GetCurrentProcess().MainModule.FileName;
            #region 当前登陆用户的注册表启动项
            RegistryKey registryKey = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
            registryKey.SetValue(applictionName, applictionPath);
            #endregion
            #region 所有用户的注册表启动项
            //RegistryKey registryKey = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
            //registryKey.SetValue(applictionName, applictionPath);
            #endregion
        }
    }
}

标签:控件,sender,notifyIcon,C#,系统托盘,private,自启动,new,void
From: https://www.cnblogs.com/vipsoft/p/18665897

相关文章

  • Lec 11 调度
    Lec11处理器调度License本内容版权归上海交通大学并行与分布式系统研究所所有使用者可以将全部或部分本内容免费用于非商业用途使用者在使用全部或部分本内容时请注明来源资料来自上海交通大学并行与分布式系统研究所+材料名字对于不遵守此声明或者其他违法使用本内容者,将......
  • leetcode[42][hard]接雨水
     目录题目思路答案一、题目给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例1:输入:height=[0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组[0,1,0,2,1,0,1,3,2,1,2,1]表示的高度图,在这种情况下,可以接6......
  • RepPoints: Point Set Representation for Object Detection—用于目标检测的点集表示
    用于目标检测的点集表示-RepDet全网最全InternationalConferenceonComputerVision(ICCV2019)对这种检测模型生成的点进行基于点的匹配过程完成跟踪但是可否保证随着人的运动或者形状的改变每次选取的关键点是否一致呢?文章目录用于目标检测的点集表示-RepDet全......
  • [笔记] 使用 Jenkins 和 Nginx 实现前端项目的持续集成与部署 (CICD) : 从 GitLab 拉
    在现代软件开发中,持续集成与持续部署(CI/CD)已经成为提高开发效率、保证代码质量的重要手段。对于前端项目来说,如何快速、稳定地将代码从开发环境推送到生产环境,是一个关键问题。本文将详细介绍如何使用Jenkins和Nginx实现前端项目的CI/CD流程,确保每次代码提交都能自动......
  • 中考英语优秀范文-热点话题-传统文化-002 Spreading Traditional Chinese Culture 传
    1写作要求近日,在公共场所,人们身着汉服拍照,演奏古筝、二胡等传统乐器;校园里,学生吟诵古典诗词,写毛笔字……处处彰显着中国传统文化的魅力。你校英文报正在组织题为SpreadingTraditionalChineseCulture的征文活动,请你选择下表中的一种传统文化的形式,写一篇短文投稿,内容包括:1......
  • 代码生成器CodeGenerator
    CodeGenerator是一款用C#开发的ExcelCOM加载项,功能是基于已有的字符串有规律地生成多个字符串。该插件可用于Excel2010及其以上版本,32位、64位均可使用。插件安装方法:第1步:右键以管理员身份运行RegAsm.bat第2步:双击CodeGenerator.Connect.reg第3步:启动Excel,可以看到出现了自定......
  • LeetCode:3.无重复字符的最长子串
    LeetCode:3.无重复字符的最长子串优化用kmp解题步骤用双指针维护一个滑动窗囗,用来剪切子串。不断移动右指针,遇到重复字符,就把左指针移动到重复字符的下一位。过程中,记录所有窗口的长度,并返回最大值。时间复杂度:O(n)空间复杂度:O(m),m是字符串中不重复字符的个数varlengthOfLonge......
  • 在 Rider 中使用 C# 创建 Windows 窗体应用 Winforms
    1,创建项目newsolution创建一个解决方案2,打开设计器在Form1.cs上右键打开设计器认识一下Rider的界面参考微软官方的例子,添加如下属性:注:这里Listbox的大小设置成120,94失败,默认的是120,89。可以将DrawMode改为OwnerDrawVariable,就可以更改大小,但是要重写......
  • LIO-SAM代码解析:mapOptmization.cpp(一)
    文章目录主流程1.`loopInfoHandler`1.1`updateInitialGuess`1.2`extractSurroundingKeyFrames`1.3`downsampleCurrentScan`1.4`scan2MapOptimization`1.5`saveKeyFramesAndFactor`1.6`correctPoses`1.7`publishOdometry`1.8`publishFrames`主流程1.loo......
  • html css网页制作成品——HTML+CSS+js绝味鸭脖网页设计(5页)附源码
      目录   一、......