【WinForm】使用C# WinForm实现带有托盘图标功能的应用程序

文章目录


前言

在开发Windows应用程序时,有时我们需要程序在后台运行时隐藏主窗口,并通过系统托盘图标进行交互。本文将介绍如何使用C# Windows Forms来实现一个带有托盘图标功能的应用程序,该程序可以通过托盘图标进行打开和退出操作。

一、项目设置

首先,创建一个新的Windows Forms项目。在默认生成的主窗体代码基础上,我们将添加托盘图标及相关功能。

二、设计界面
  1. 主窗体设计:

    • 在主窗体上放置一个NotifyIcon控件,命名为notifyIcon1。设置其Text属性(鼠标悬停在图标上时显示的提示信息),并指定一个图标文件。
    • 添加一个ContextMenuStrip控件,命名为contextMenuStrip1。在其中添加两个菜单项:"打开程序"和"退出程序",分别命名为openToolStripMenuItem和exitToolStripMenuItem。
    • 可选:在主窗体上放置一个按钮(Button),用于测试其他功能,比如显示消息框。
  2. 事件绑定:

    • 为NotifyIcon的MouseClick事件绑定处理方法,以响应鼠标点击托盘图标操作。
    • 为ContextMenuStrip中的菜单项绑定点击事件处理方法。
  3. icon设置:

    • 窗体必须设置icon,修改窗体名称
    • notifyIcon1必须设置icon,修改notifyIcon1.text名称
三、代码实现

以下是完整的代码实现,涵盖了窗体初始化、托盘图标设置、事件处理等方面:

csharp 复制代码
using System;
using System.Windows.Forms;

namespace App1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // 确保托盘图标关联了菜单
            notifyIcon1.ContextMenuStrip = contextMenuStrip1;

            // 将 Visible 设为 false 可以阻止窗体在启动时出现在任务栏和屏幕上
            this.Visible = false;

            // 订阅窗体关闭事件,拦截关闭操作
            this.FormClosing += Form1_FormClosing;
            this.Resize += Form1_Resize;
            notifyIcon1.MouseClick += notifyIcon1_MouseClick;

            // 这里的 openToolStripMenuItem 和 exitToolStripMenuItem 必须与设计器中设置的 Name 属性一致
            this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click);
            this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);

            // 初始化时,如果想默认启动就最小化到托盘
            this.WindowState = FormWindowState.Minimized;
            this.ShowInTaskbar = false;
            this.Hide();
        }

        // 拦截窗体关闭事件,改为隐藏到托盘
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (e.CloseReason == CloseReason.UserClosing) // 仅拦截用户点击×的情况
            {
                e.Cancel = true; // 取消关闭
                this.Hide();     // 隐藏窗体
                this.ShowInTaskbar = false; // 隐藏任务栏图标
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Hello, World!");
        }

        private void Form1_Resize(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Minimized)
            {
                this.Hide(); // 隐藏窗体
                this.ShowInTaskbar = false; // 隐藏任务栏图标
            }
        }

        private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
        {
            // 只有当点击的是鼠标左键时,才执行显示/隐藏逻辑
            if (e.Button == MouseButtons.Left)
            {
                // 切换窗体的可见性
                if (!this.Visible)
                {
                    this.Show();
                    this.WindowState = FormWindowState.Normal;
                    this.ShowInTaskbar = true;
                    this.Activate();
                }
                else
                {
                    this.Hide();
                }
            }
            // 如果点击的是右键(MouseButtons.Right)或者中键,这里什么也不做
            // 系统会自动接管,显示设置好的 ContextMenuStrip (右键菜单)
        }

        // 托盘图标右键菜单:打开程序
        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Show();
            this.WindowState = FormWindowState.Normal;
            this.ShowInTaskbar = true;
            this.Activate();
        }

        // 托盘图标右键菜单:退出程序
        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DialogResult result = MessageBox.Show("确定要退出程序吗?", "退出确认", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);

            // 如果用户点击了"确定"按钮
            if (result == DialogResult.OK)
            {
                // 1. 隐藏托盘图标(可选:让图标在关闭前消失)
                notifyIcon1.Visible = false;

                // 2. 退出应用程序
                Application.Exit();
            }
        }

        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            openToolStripMenuItem_Click(sender, e);
        }
    }
}
四、功能说明
  1. 启动与隐藏:程序启动时,主窗体将被隐藏,只显示托盘图标。
  2. 托盘图标交互 :
    • 左键单击托盘图标可以切换主窗体的显示与隐藏。
    • 右键单击托盘图标将弹出菜单,可以选择"打开程序"显示主窗体,或选择"退出程序"关闭应用程序。
  3. 关闭拦截:当用户尝试关闭主窗体时,程序将拦截关闭操作,转而隐藏主窗体并保持程序在后台运行。
五、总结

通过上述步骤,我们成功实现了一个带有托盘图标功能的Windows Forms应用程序。该程序能够在后台运行,并通过托盘图标与用户进行交互,提供了更好的用户体验和更灵活的操作方式。在实际开发中,可以根据具体需求对托盘图标的功能进行扩展和定制。

相关推荐
weixin_307779131 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
一水鉴天4 小时前
映射、哈希表与哈斯图:计算机科学的三种基线 20261003(元宝)
开发语言·人工智能
Frank_refuel4 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
Wang's Blog5 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
2601_962071576 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
\光辉岁月/7 小时前
5.java-数组
java·开发语言
Java后端的Ai之路7 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
谢亮_vipxieliang7 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
时间的拾荒人7 小时前
Qt 多线程详解:从 QThread 到实战
开发语言·qt·面试
郑州光合科技余经理7 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程