65.9K
CodeProject 正在变化。 阅读更多。
Home

NotifyIcon类的替代实现

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (57投票s)

2002年4月11日

3分钟阅读

viewsIcon

445370

downloadIcon

12991

一个带有气泡提示支持的通知图标(托盘图标)的包装类。

Sample Image - NotifyIconEx_img.png

引言

我最近编写了一个 Visual SourceSafe 狙击应用程序。这个程序的目的在于在后台耐心等待选定的 Visual SourceSafe 文件被其他程序员签入。当文件被签入时,狙击程序会签出这些文件并通知用户。这似乎是通知图标的完美工作。然而,我感到沮丧的是,.NET 类库的 NotifyIcon 类不支持气泡提示,而气泡提示是较新版本的通用控件库提供的。这促成了我的 CodeProject 文章 '显示 Notify Icon 的气泡工具提示'。然而,这种方法充其量只是一个权宜之计,并且不允许应用程序在气泡提示被点击时收到通知。所以我决定咬紧牙关,编写我自己的 NotifyIcon 类,这将使我能够做我想做的一切。

功能

我将这个类的功能保持在我认为有用的最小范围内。例如,我不处理通知图标上的鼠标移动消息,因为我想不出这些消息的任何好的用途。但是,添加此功能非常容易。

功能列表

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

工作原理

我的类使用与 .NET 类类似的方法,即创建一个隐藏窗口来接收来自通知图标的消息。然后,这些消息将被转发到主类 NotifyIconEx,在那里它们会根据通知图标的数字 ID 进行过滤。我的类可用于添加多个通知图标,并且所有消息都由一个隐藏窗口处理。在这一点上,我必须承认,我使用了 'Anakrino' 反编译器来窥探一些用于实现 .NET 的 NotifyIcon 类代码。我主要用它来弄清楚如何在正确的位置显示上下文菜单,以及如何确保当您在菜单外点击时它会关闭。

平台调用方法在这个类中被广泛使用,这很不幸但很有必要。希望随着 .NET 的成熟,类库将会扩展以允许对 Windows 和系统功能进行更高级的操控,但在此之前,要么放弃这个很酷的功能,要么退回到 Win32 API。

遇到的问题

我必须承认,关于气泡提示的文档似乎与行为不符。超时值似乎不起作用。当气泡通过 'x' 按钮关闭时,我无法获得正确的 Windows 消息。无论气泡超时还是由用户关闭,我都会收到“超时”消息。如果我在这些问题上做错了任何事情,或者如果有人在我的 XP 机器上得到与我不同的结果,请告诉我。

注意

我必须警告您,如果您同时使用我的 NotifyIconEx 类和 NotifyIcon,可能会发生奇怪的事情。看看您是否能找出原因。

结束语

我想您会发现我的类使用起来就像 .NET 提供的类一样简单,如果不是更简单的话(当您的应用程序退出时,您不必显式移除我的图标)。您应该能够将该类添加到工具箱中,并像使用内置类一样使用表单设计器进行拖放。

© . All rights reserved.