在软件开发中,经常需要在后台等待某些事件的发生,比如等待其他程序员将Visual Source Safe文件检入。当这些文件被检入时,需要能够及时得到通知。在这种情况下,使用通知图标就显得非常合适。然而,.NET类库中的NotifyIcon类并不支持气球提示,这让感到非常失望。为了解决这个问题,决定开发一个自定义的NotifyIcon类,以实现想要的所有功能。
在开发过程中,参考了.NET类库的实现方式,创建了一个隐藏窗口来接收通知图标的消息。这些消息会被转发到主类NotifyIconEx,根据通知图标的数字ID进行过滤。这样,就可以添加多个通知图标,并且所有消息都由一个隐藏窗口来处理。
在设计这个类时,尽量保持功能的简洁性,只包含了认为有用的功能。例如,没有处理鼠标在通知图标上的移动消息,因为想不到这些消息的具体用途。但是,添加这个功能是相当容易的。以下是这个类的一些主要功能:
这个类使用了一个与.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);
}
}