自定义通知图标类的开发与应用

在软件开发中,经常需要在后台等待某些事件的发生,比如等待其他程序员将Visual Source Safe文件检入。当这些文件被检入时,需要能够及时得到通知。在这种情况下,使用通知图标就显得非常合适。然而,.NET类库中的NotifyIcon类并不支持气球提示,这让感到非常失望。为了解决这个问题,决定开发一个自定义的NotifyIcon类,以实现想要的所有功能。

在开发过程中,参考了.NET类库的实现方式,创建了一个隐藏窗口来接收通知图标的消息。这些消息会被转发到主类NotifyIconEx,根据通知图标的数字ID进行过滤。这样,就可以添加多个通知图标,并且所有消息都由一个隐藏窗口来处理。

功能特性

在设计这个类时,尽量保持功能的简洁性,只包含了认为有用的功能。例如,没有处理鼠标在通知图标上的移动消息,因为想不到这些消息的具体用途。但是,添加这个功能是相当容易的。以下是这个类的一些主要功能:

  • 触发事件:'Click', 'Double Click', 'Click Balloon'
  • 声明属性:'Visible', 'Icon', 'Text', 'Context Menu'
  • 当垃圾回收时,从通知区域移除图标
  • 如果资源管理器重启,重新添加图标
  • 提供方法:ShowBalloon(string title, string text, int timeout)

工作原理

这个类使用了一个与.NET类库相似的方法,即创建一个隐藏窗口来接收通知图标的消息。这些消息会被转发到主类NotifyIconEx,根据通知图标的数字ID进行过滤。这样,就可以添加多个通知图标,并且所有消息都由一个隐藏窗口来处理。

在开发过程中,使用了'Anakrino'反编译器来查看.NET的NotifyIcon类的实现代码。主要用它来弄清楚如何在正确的位置显示上下文菜单,以及如何确保当点击菜单外的地方时,菜单会自动关闭。

这个类中广泛使用了平台调用方法,这是不幸但必要的。希望随着.NET的成熟,类库能够扩展,允许更高级的窗口和系统功能的操纵。但在那之前,要么放弃这个酷功能,要么退回到Win32 API。

遇到的问题

在开发过程中,遇到了一些问题。首先,关于气球提示的文档似乎与实际行为不符。无法得到正确的窗口消息,当气球被'x'按钮关闭时。无论是气球超时还是被用户关闭,都得到了'timeout'消息。如果在这方面有任何问题,或者在XP机器上得到了不同的结果,请告诉。

其次,如果同时使用NotifyIconEx类和NotifyIcon类,可能会发生一些奇怪的事情。如果能找出原因,请告诉。

注意事项

最后,想提醒,类应该和.NET提供的类一样简单,甚至更简单(不需要在应用程序退出时显式移除图标)。应该能够将这个类添加到工具箱中,并使用表单设计器拖放它,就像使用内置类一样。

代码示例

以下是使用自定义NotifyIconEx类的一个简单示例:

public class MainForm : Form { private NotifyIconEx notifyIcon; public MainForm() { notifyIcon = new NotifyIconEx(); notifyIcon.Icon = SystemIcons.Application; notifyIcon.Visible = true; notifyIcon.Text = "My Notification Icon"; notifyIcon.ShowBalloon("Hello", "This is a balloon tip.", 5000); } protected override void OnFormClosing(FormClosingEventArgs e) { notifyIcon.Visible = false; base.OnFormClosing(e); } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485