在本文中,我们将深入探讨如何在WPF应用中实现一个友好的`Shell_NotifyIcon`包装器类,特别是在处理程序最小化至系统托盘时。`Shell_NotifyIcon`是Windows API提供的一项功能,用于创建并管理任务栏通知区域(系统托盘)的小图标。在C#中,我们通常通过P/Invoke技术来调用这些API函数。 **P/Invoke**(Platform Invoke)是.NET框架提供的一种机制,允许托管代码(如C#)调用非托管的DLL(如Win32 API)中的函数。在本例中,我们需要用P/Invoke来调用`Shell_NotifyIcon`相关API,因为它们并未被.NET Framework直接封装。 **第一部分:P/Invoke声明** 我们需要在C#代码中声明`Shell_NotifyIcon`的相关函数。这通常包括`Shell_NotifyIcon(NIM_ADD)`用于添加图标,`Shell_NotifyIcon(NIM_MODIFY)`用于修改图标,以及`Shell_NotifyIcon(NIM_DELETE)`用于删除图标等。此外,还需要定义结构体`NOTIFYICONDATA`来存储图标信息。 ```csharp [DllImport("shell32.dll", SetLastError = true)] private static extern bool Shell_NotifyIcon(NotifyCommand command, ref NOTIFYICONDATA data); [StructLayout(LayoutKind.Sequential)] private struct NOTIFYICONDATA { //... } ``` **第二部分:封装Shell_NotifyIcon** 接下来,创建一个类`WpfShellNotifyIcon`,作为`Shell_NotifyIcon`的包装器。这个类应包含添加、修改和删除图标的公共方法,并负责处理与系统托盘交互的各种逻辑。同时,为了处理窗口状态改变,需要监听`SizeChanged`事件,当窗口最小化时将窗口隐藏并显示系统托盘图标。 ```csharp public class WpfShellNotifyIcon { private NotifyIconData _iconData; public void AddIcon.ico(BitmapSource icon) { //... } public void ModifyIcon(BitmapSource newIcon) { //... } public void RemoveIcon() { //... } private void OnSizeChanged(object sender, SizeChangedEventArgs e) { if (e.NewSize.Width == 0 && e.NewSize.Height == 0) { // 窗口最小化,隐藏窗口并显示系统托盘图标 } } } ``` **第三部分:使用示例** 在WPF应用中,你可以创建一个`WpfShellNotifyIcon`实例,设置图标,并在窗口最小化时进行处理。提供的`MinimizeToSystemTray_src.zip`和`MinimizeToSystemTray_demo{1,2}.zip`应该是示例代码和演示应用,包含如何实际使用此包装器类的详细示例。 ```csharp public partial class MainWindow : Window { private WpfShellNotifyIcon _notifyIcon; public MainWindow() { InitializeComponent(); _notifyIcon = new WpfShellNotifyIcon(); _notifyIcon.AddIcon.ico(IconFromBitmapSource(BitmapSource.FromResource("icon.ico"))); SizeChanged += OnSizeChanged; } private void OnSizeChanged(object sender, SizeChangedEventArgs e) { _notifyIcon.OnSizeChanged(e); } } ``` **总结** 通过这个封装类,我们可以方便地在WPF应用中实现窗口最小化到系统托盘的功能,同时保持代码的整洁和可维护性。`Shell_NotifyIcon`的包装器类不仅简化了API的调用,还提供了更高级别的功能,如图标更新和事件处理。对于那些希望在Win10环境下开发具有系统托盘功能的WPF应用的开发者来说,这是一个非常实用的技术。
- 1
- 粉丝: 1
- 资源: 970
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助