在C# WinForms桌面程序开发中,通过NotifyIcon组件可以轻松实现系统托盘图标的管理,让程序支持最小化到托盘、托盘图标交互等常见功能。下面将从基础配置到完整功能实现逐步讲解具体操作方法。

一、添加NotifyIcon组件
首先需要在WinForms窗体项目中添加NotifyIcon组件,操作步骤如下:
- 打开窗体的设计视图,在工具箱中找到
NotifyIcon组件,拖拽到窗体上 - 选中拖拽后的NotifyIcon组件,在属性面板中设置
Icon属性,选择要显示的托盘图标文件(建议尺寸为16*16或32*32的ico格式) - 设置
Text属性,该内容会在鼠标悬停在托盘图标时显示,比如设置为程序名称 - 将
Visible属性初始设置为false,避免程序启动时就显示托盘图标
二、实现窗口最小化到托盘
要实现窗口最小化后隐藏到系统托盘,需要监听窗体的最小化事件,在事件触发时隐藏窗体并显示托盘图标。核心代码如下:
using System;
using System.Windows.Forms;
namespace TrayIconDemo
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
// 监听窗体尺寸变化事件
this.Resize += MainForm_Resize;
}
private void MainForm_Resize(object sender, EventArgs e)
{
// 判断窗体是否最小化
if (this.WindowState == FormWindowState.Minimized)
{
// 隐藏窗体
this.Hide();
// 显示托盘图标
notifyIcon1.Visible = true;
}
}
}
}
三、实现托盘图标点击恢复窗口
用户点击托盘图标时,需要恢复窗体显示并隐藏托盘图标,我们可以监听NotifyIcon的MouseClick事件实现该逻辑:
private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
{
// 判断是否是左键点击
if (e.Button == MouseButtons.Left)
{
// 恢复窗体显示
this.Show();
// 将窗体状态设置为正常
this.WindowState = FormWindowState.Normal;
// 激活窗体,使其显示到最前
this.Activate();
// 隐藏托盘图标
notifyIcon1.Visible = false;
}
}
注意需要在设计视图中,选中notifyIcon1组件,在属性面板的事件栏里绑定MouseClick事件到上述方法,或者在窗体构造函数中手动绑定:
public MainForm()
{
InitializeComponent();
this.Resize += MainForm_Resize;
// 手动绑定托盘图标点击事件
this.notifyIcon1.MouseClick += notifyIcon1_MouseClick;
}
四、添加托盘图标右键菜单
通常托盘图标需要支持右键菜单,提供恢复窗口、退出程序等选项,我们可以通过ContextMenuStrip组件实现:
首先在窗体上拖拽一个ContextMenuStrip组件,添加两个菜单项,分别命名为恢复窗口和退出程序,然后设置notifyIcon1的ContextMenuStrip属性为该菜单组件。两个菜单项的点击事件代码如下:
private void 恢复窗口ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 恢复窗口逻辑和左键点击托盘图标一致
this.Show();
this.WindowState = FormWindowState.Normal;
this.Activate();
notifyIcon1.Visible = false;
}
private void 退出程序ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 释放托盘图标资源
notifyIcon1.Visible = false;
notifyIcon1.Dispose();
// 退出应用程序
Application.Exit();
}
五、程序退出时释放资源
为了避免程序退出后托盘图标仍然残留,需要在窗体关闭事件中处理托盘图标的资源释放:
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
// 隐藏并释放托盘图标
if (notifyIcon1.Visible)
{
notifyIcon1.Visible = false;
notifyIcon1.Dispose();
}
}
同样需要在窗体属性事件中绑定FormClosing事件到上述方法。
常见问题说明
- 如果托盘图标不显示,首先检查
Icon属性是否正确设置了有效的ico文件,其次检查Visible属性是否在需要显示时设置为true - 窗体恢复时如果无法激活到前台,可以在
Activate()方法前添加this.TopMost = true;,激活后再设置为false - 托盘图标点击事件如果无响应,检查事件是否正确绑定,以及是否判断了鼠标点击的按键类型
C#NotifyIcon系统托盘图标WinForms修改时间:2026-07-23 05:36:24