🔥 第一章:基础实现——让窗体优雅潜伏
目标:点击最小化按钮,窗体消失,托盘图标登场
🧙 代码彩蛋:最小化到托盘的核心代码
public partial class MainForm : Form
{
private NotifyIcon _notifyIcon; // 系统托盘图标
private ContextMenuStrip _contextMenu; // 右键菜单
public MainForm()
{
InitializeComponent();
InitializeTray(); // 初始化托盘相关组件
}
// 初始化托盘和菜单
private void InitializeTray()
{
// 1. 创建NotifyIcon实例
_notifyIcon = new NotifyIcon
{
Icon = Properties.Resources.AppIcon, // 使用资源文件中的图标(必须为.ico格式)
Text = "我的程序", // 鼠标悬停时显示的提示文本
Visible = false // 初始隐藏
};
// 2. 创建右键菜单
_contextMenu = new ContextMenu();
_contextMenu.MenuItems.Add("显示窗体", ShowForm); // 显示窗体菜单项
_contextMenu.MenuItems.Add("显示气泡", ShowBalloon); // 气泡提示菜单项
_contextMenu.MenuItems.Add("退出程序", ExitApp); // 退出程序菜单项
// 3. 绑定事件
_notifyIcon.Click += NotifyIcon_Click; // 单击托盘图标事件
_notifyIcon.DoubleClick += NotifyIcon_DoubleClick; // 双击托盘图标事件
}
// 窗体关闭事件:拦截关闭操作,改为隐藏窗体
protected override void OnFormClosing(FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true; // 取消默认关闭行为
HideForm(); // 隐藏窗体,显示托盘图标
}
base.OnFormClosing(e);
}
// 隐藏窗体并显示托盘图标
private void HideForm()
{
this.Hide(); // 隐藏窗体
_notifyIcon.Visible = true; // 显示托盘图标
}
// 双击托盘图标时显示窗体
private void NotifyIcon_DoubleClick(object sender, EventArgs e)
{
ShowForm(); // 显示窗体
}
// 显示窗体方法
private void ShowForm()
{
this.Show(); // 显示窗体
this.WindowState = FormWindowState.Normal; // 恢复正常状态
_notifyIcon.Visible = false; // 隐藏托盘图标
}
}
注释彩蛋:
- 资源文件:图标必须为
.ico
格式,可通过Properties.Resources
管理 - 事件绑定:通过
Click
和DoubleClick
事件控制图标交互 - OnFormClosing:拦截用户点击关闭按钮的操作,改为隐藏窗体
🌡️ 第二章:右键菜单——打造“多任务控制台”
目标:让右键菜单成为你的“瑞士军刀”
🧙 代码彩蛋:右键菜单的魔法扩展
// 在InitializeTray方法中扩展右键菜单
private void InitializeTray()
{
// ...(原有代码)
// 4. 高级菜单项:动态添加子菜单
var settingsMenuItem = new MenuItem("设置");
settingsMenuItem.MenuItems.Add("主题模式", ToggleTheme); // 子菜单项
_contextMenu.MenuItems.Insert(0, settingsMenuItem); // 插入到菜单顶部
// 5. 分割线
_contextMenu.MenuItems.Add(new MenuItem("-")); // 分割线
// 6. 绑定快捷键(如Ctrl+Q退出)
this.KeyPreview = true; // 允许窗体捕获键盘事件
this.KeyDown += (sender, e) =>
{
if (e.Control && e.KeyCode == Keys.Q)
{
ExitApp(); // 按Ctrl+Q触发退出
}
};
}
// 显示气泡提示
private void ShowBalloon(object sender, EventArgs e)
{
_notifyIcon.ShowBalloonTip(
3000, // 显示时间(毫秒)
"提示", // 标题
"您有一条新消息!", // 内容
ToolTipIcon.Info // 图标类型
);
}
// 退出程序
private void ExitApp(object sender = null, EventArgs e = null)
{
_notifyIcon.Dispose(); // 释放资源
Application.Exit(); // 退出程序
}
// 切换主题模式
private void ToggleTheme(object sender, EventArgs e)
{
this.BackColor = this.BackColor == Color.White ? Color.Black : Color.White; // 简单切换黑白主题
_notifyIcon.Text = "主题已切换"; // 更新托盘提示文本
}
注释彩蛋:
- 子菜单:通过
MenuItem.MenuItems
嵌套实现多级菜单 - 快捷键:通过
KeyDown
事件绑定全局快捷键(如Ctrl+Q) - 资源释放:退出前务必调用
_notifyIcon.Dispose()
,避免内存泄漏
📊 第三章:气泡提示——让托盘图标“开口说话”
目标:用气泡提示实现“无声的沟通”
🧙 代码彩蛋:定制化气泡提示
// 在Form_Load事件中初始化气泡提示
private void MainForm_Load(object sender, EventArgs e)
{
// 自动显示欢迎气泡
_notifyIcon.ShowBalloonTip(
2000,
"欢迎使用",
"程序已最小化到托盘,双击图标可恢复",
ToolTipIcon.Info
);
}
// 自定义气泡样式
private void ShowCustomBalloon(string title, string message, ToolTipIcon icon)
{
// 设置气泡样式
_notifyIcon.BalloonTipTitle = title;
_notifyIcon.BalloonTipText = message;
_notifyIcon.BalloonTipIcon = icon;
// 显示气泡
_notifyIcon.ShowBalloonTip(3000);
}
// 示例:错误提示
private void ShowErrorBalloon(string errorMessage)
{
ShowCustomBalloon(
"错误",
errorMessage,
ToolTipIcon.Error
);
}
注释彩蛋:
- 自动提示:程序启动时自动显示欢迎气泡,提升用户体验
- 样式控制:通过
BalloonTipIcon
选择不同图标(Info/Warning/Error) - 复用逻辑:将气泡逻辑封装为
ShowCustomBalloon
,避免重复代码
🔒 第四章:异常处理——比防小三还重要的容错设计
目标:让程序像“防弹衣”一样抵御崩溃
🧙 代码彩蛋:全局异常捕获与日志
// 在Main方法中启用全局异常处理
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// 全局异常捕获
AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
{
var exception = e.ExceptionObject as Exception;
LogError(exception?.Message); // 记录错误日志
MessageBox.Show(
"程序发生严重错误!\n" + exception?.Message,
"错误",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
Application.Exit(); // 强制退出
};
Application.Run(new MainForm());
}
// 日志记录(简化版)
private static void LogError(string message)
{
File.AppendAllText(
"error.log",
$"{DateTime.Now:yyyy-MM-dd HH:mm:ss} - {message}\n"
);
}
// 安全退出程序
private void ExitApp()
{
try
{
_notifyIcon.Dispose(); // 尝试释放资源
}
catch (Exception ex)
{
LogError($"释放资源失败:{ex.Message}"); // 记录异常
}
finally
{
Application.Exit(); // 最终退出
}
}
注释彩蛋:
- 全局捕获:通过
AppDomain.UnhandledException
捕获未处理异常 - 日志记录:将错误信息写入文件,便于后续分析
- 资源释放:在退出前确保
NotifyIcon
被正确释放
🎮 第五章:实战演练——打造你的“托盘大师”
目标:整合所有功能,做一个“全能托盘程序”
🧙 代码彩蛋:完整项目结构
// MainForm.cs
public partial class MainForm : Form
{
// ...(所有上述代码整合)
}
// 程序入口:Program.cs
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// 全局异常处理
AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
{
var exception = e.ExceptionObject as Exception;
MessageBox.Show(
"程序发生严重错误!\n" + exception?.Message,
"错误",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
Application.Exit();
};
Application.Run(new MainForm());
}
}
通过本文,你已经掌握了:
- NotifyIcon实现窗体潜伏
- 右键菜单的多任务控制
- 气泡提示的魔法攻击
- 全局异常处理与日志