1. 项目概述:为什么需要系统托盘功能?
在开发Windows桌面应用时,我们经常会遇到一个经典场景:用户点击窗口右上角的"最小化"按钮后,程序窗口从任务栏消失,但用户仍然希望保持应用在后台运行。这时候,系统托盘(System Tray)就成了最佳解决方案。不同于传统的任务栏最小化,系统托盘图标可以让应用在不干扰用户工作区的情况下持续运行,同时提供快速唤醒入口。
我最近为一个医疗行业的WPF应用实现了这个功能。医生在使用过程中经常需要临时查看其他患者资料,但又不想完全关闭当前患者的监护界面。通过系统托盘方案,我们让应用在"最小化"时自动缩到托盘区,双击图标即可恢复窗口,这比传统的任务栏最小化体验更符合医护人员的操作习惯。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术方案选型与准备
2.1 WPF与Win32 API的交互
WPF本身并没有直接提供系统托盘的控件,我们需要借助Windows API来实现。这里主要用到的是Shell_NotifyIcon函数,它属于shell32.dll库。在.NET中,我们可以通过P/Invoke(平台调用)来访问这些Win32 API。
csharp复制[DllImport("shell32.dll", CharSet = CharSet.Auto)]
public static extern bool Shell_NotifyIcon(int message, NOTIFYICONDATA pnid);
注意:使用P/Invoke时需要特别注意32位和64位系统的兼容性问题。建议在结构体定义时显式指定字段的布局和大小。
2.2 必要的NuGet包
虽然可以直接调用API,但为了简化开发,我推荐使用Hardcodet.NotifyIcon.Wpf这个专门为WPF设计的开源库。它封装了所有底层细节,提供了更符合WPF开发习惯的API。
安装命令:
bash复制Install-Package Hardcodet.NotifyIcon.Wpf
这个库的优势在于:
- 完全托管代码实现,无需处理复杂的互操作
- 支持数据绑定和MVVM模式
- 内置常见功能如气泡提示、上下文菜单等
- 活跃的社区维护
3. 核心实现步骤详解
3.1 创建托盘图标控件
首先在XAML中定义托盘图标
