使用Shell_NotifyIcon 建一个标准气泡通知盒图标

这篇博客介绍了一个.NET扩展控件,用于创建使用Shell32.dll的标准气泡提示通知,支持系统升级后的功能。控件特性包括:标准Shell32.dll气泡提示,三键点击回调,右键菜单支持,动态图标,以及多窗口应用兼容。文章还提供了类库的详细内容,结构和API常量,并展示了如何使用示例代码,帮助开发者进行二次开发。
摘要由CSDN通过智能技术生成

  虽然.net 扩展并平民化了大部分的API,但就notifyicon 来讲,系统自己的notifyicon 做的必然安全,以至于 shell32.dll 新版本(此气泡功能是win98 的ie5 就具备)的功能完全得不到体现,在CSDN 我也见过不少的人都在为扩展一个更完美的notifyicon 做努力,为此笔者就在中秋前夜的一些空闲写了这个扩展控件权砖引玉,这二天就有不少朋友扔鸡蛋,于是特撰此稿来补充此控件的功能及它的具体内容以便于朋友们的二次开发,本文也定义了大部分的一些的常数和结构。

预览图:

组件类特点如下:

  1. 标准Shell32.dll 的气泡提示,随系统升级
  2. 支持左、右、中三键点击回调
  3. 支持右键菜单(Handle 引用,所以可以自己动态建也可以用.net 自己的ContextMenu)
  4. 支持动态图标(Handle 引用,所以可以自己画或资源/外部引用,然后定时改变,用此组件的 ModiNotifyBox 对原有的图标进行修改,它的参数和 AddNotifyBox 一样,只要改变它的icon 句柄为新 icon 的句柄就行了)
  5. 不使用静态,允许多个Icon 互不冲突,可用于多窗体软件

类内容如下:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace ArLi.CommonPrj //要改此名要注意改 InnerClass 里的引用
{
 using System.IO;
 using System.Diagnostics;

 /// <summary>
 /// Shell_NotifyIconEx Class.
 public class Shell_NotifyIconEx
 {
  /// <summary>
  /// ArLi, last fix: 2003.9.12, reference: ArLi.CommonPrj Lib @
http://zpcity.com/arli/
  /// </summary>
  public static readonly System.Version myVersion = new System.Version(1,2); //版本声明

  private readonly InnerClass.FormTmp formTmp = null; // 这个很重要,不能放在构造里,因为它必须和此实例同等生存期才不会被中止消息循环
  private readonly IntPtr formTmpHwnd = IntPtr.Zero; // 这是上一行的句柄
  private readonly bool VersionOk = false; // 这是一个由VersionPass 返回的属性,它允许开发者检测当前机子的Shell32.dll(可能在win95 或未知平台上版本) 合适此组,不符则用.net 自己的notifyicon
  private bool forgetDelNotifyBox = false; // 这是一个私有标志,它允许开发者在程序退出时忘记调用DelNotifyBox 来清除图标时会自动在析构里清掉它。
  
  internal IntPtr formHwnd = IntPtr.Zero; // 这是调用此组件的主窗口句柄(当前实例有效,可多个icon 不冲突)
  internal IntPtr contextMenuHwnd = IntPtr.Zero; // 这是菜单的句柄(当前实例有效,可多个icon 不冲突)

  internal delegate void delegateOfCallBack(System.Windows.Forms.MouseButtons mb);
  internal delegateOfCallBack _delegateOfCallBack = null;

  public Shell_NotifyIconEx() // 构造
  {
   WM_NOTIFY_TRAY += 1; // 消息ID +1,避免多个ICON 消息处理冲突
   uID += 1; // 同上
   formTmp = new InnerClass.FormTmp(this); // 新实例一个消息循环
   formTmpHwnd = formTmp.Handle; // 新实例句柄
   VersionOk = this.GetShell32VersionInfo() >= 5; // 版本是否合适,此组件由于重点在气泡提示,它要求Shell32.dll 5.0(ie 5.0) 以上
  }

  ~ Shell_NotifyIconEx() { // 析构
   if (forgetDelNotifyBox) this.DelNotifyBox(); //如果开发者忘记则清理icon
  }

  #region API_Consts

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值