来个更BT的NotifyIcon支持BalloonTip

简介:
  前两天通过Reflect FX1.1的NotifyIcon实现了一个可以支持BalloonTip的NotifyIconEx,后来发现其实如果不需要截获Balloon Tip上的事件,比如balloon show、click和close,的话。可以使用更加简便且BT的方法来获得Balloon Tip,而更本不用修改FX1.1中的NotifyIcon,使用Reflector代码必须要自己注册一大堆Native方法,忒麻烦。

    使用BT方法也就是访问FX1.1 NotifyIcon的私有成员,获取窗口的Handle,这个参数是控制NotifyIcon的关键。另一个关键参数是NotifyIcon.Icon.Handle,不过这个时pulice的,可以随意取到。看看关于NotifyIcon的前两篇文中,知道NotifyIcon控件所使用的窗口Handle是通过一个内部类来获得的。如果我们能访问到这个内部类,岂不是就能获得最关键的参数Handle了吗?所以我们通过Reflection来获取了NotifyIcon实例中的内部类的窗口Handle,参考代码如下:
private IntPtr GetWindowHandle(NotifyIcon notifyIcon)
{
     if ( notifyIcon ==  null )
    {
         return IntPtr.Zero;
    }

    Type type = notifyIcon.GetType();
    BindingFlags bf = BindingFlags.Instance | BindingFlags.NonPublic;
    FieldInfo fiWindow = type.GetField("window", bf);
     object objWindow = fiWindow.GetValue( this.m_NotifyIcon);

    type = objWindow.GetType().BaseType;
    FieldInfo fiHandle = type.GetField("handle", bf);
    IntPtr handle = (IntPtr)fiHandle.GetValue(objWindow);
     return handle;
}

    这样一来,我们只需要使用5.0版本以上的NOTIFYICONDATA,并使用已有的NotifyIcon实例,就可以让其支持Balloon Tip了 。ShowBalloonTip方法参考如下:
public  void ShowBubbleTip(InfoIcon infoIcon,  string title,  string message,  uint timeout)
{
     if (  this.m_NotifyIcon !=  null )
    {
        nid.hWnd = GetWindowHandle( this.m_NotifyIcon);
        nid.hIcon =  this.m_NotifyIcon.Icon.Handle;
    }

    nid.uTimeoutOrVersion = timeout;
    nid.szInfoTitle = title;
    nid.szInfo = message;
    nid.dwInfoFlags = ( int)infoIcon;

    Shell_NotifyIcon(0x01, nid);
}

    整个NotifyIconDummy加上NOTIFYICONDATA结构及Shell_NotifyIcon方法导入,才130来行代码。而且由于不用重新编译FX1.1的NotifyIcon,似乎少了一些潜在出错的危险。不过这个Dummy有个问题,就是没有办法listen到Balloon Tip上的事件,它们是:Show、Click和Close。看来有得必有失呀

    使用NotifyIconDummy非常简单,只用拖一个到窗体上,把需要显示Balloon Tip的NotifyIcon实例赋值给它就行了:
     NotifyIconDummy.gif

    Demo project and full code download from here, enjoy it.


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

目录
相关文章
|
运维 安全 Cloud Native
阿里云云安全中心不同版本的区别
阿里云云安全中心不同版本的区别,云安全中心基础版免费、防病毒班432元一年、高级版优惠价969元一年,还有企业版和旗舰版可选,阿里云百科分享阿里云安全中心详细介绍,包括云安全中心功能、不同版本价格表以及有必要购买说明
665 0
|
JavaScript API
uniapp录音功能
uniapp录音功能
272 0
|
JavaScript API 调度
Pinia进阶:优雅的setup(函数式)写法+封装
相信在座各位假如使用Vue生态开发项目情况下,对Pinia状态管理库应该有所听闻或正在使用,假如还没接触到Pinia,这篇文章可以帮你快速入门,并如何在企业项目中更优雅封装使用。
577 154
|
设计模式 传感器 数据处理
探索设计模式的魅力:为什么你应该了解装饰器模式-代码优化与重构的秘诀
装饰器模式是一种设计模式,它允许在运行时向对象添加额外的职责,而无需修改其代码。这种模式提供了一种动态扩展对象功能的方法,同时保持了对象的单一职责原则。本文介绍了装饰器模式的基本概念、原理、优势、适用场景、实现方法、最佳实践和注意事项。通过装饰器模式,可以将多个行为组合成一个更复杂的行为,而无需使用继承或大量的接口实现。装饰器模式适用于需要对一个对象进行一系列的增强处理的情况,而这些增强处理可以以一种松耦合的方式进行组合。通过使用装饰器模式,可以提高代码的可维护性、可扩展性和灵活性,使系统更加灵活和易于维护
358 1
探索设计模式的魅力:为什么你应该了解装饰器模式-代码优化与重构的秘诀
|
12月前
|
数据挖掘 OLAP BI
OLAP技术:数据分析的修仙秘籍初探
OLAP(联机分析处理)是一种多维数据分析技术,能够从不同角度洞察数据,揭示隐藏的趋势和模式。它最早由Edgar F. Codd在1993年提出,旨在弥补传统OLTP系统的不足,支持复杂的数据分析与决策支持。OLAP操作包括钻取、上卷、切片、切块和旋转等,帮助用户灵活地探索数据。广泛应用于财务报告、市场分析、库存管理和预测分析等领域,是现代商业智能的重要工具。
337 7
|
缓存 算法 网络协议
OSPF的路由计算算法:原理与应用
OSPF的路由计算算法:原理与应用
752 4
|
算法
基于Google Earth Engine的Landsat单窗算法地表温度(LST)反演
基于Google Earth Engine的Landsat单窗算法地表温度(LST)反演
740 2
|
算法
ECCV 2024:盲视频去闪烁通用方法BlazeBVD来了,美图&国科大联合提出
【8月更文挑战第15天】随着多媒体的兴起,视频成为信息传播的关键媒介,但视频中的闪烁问题影响观看体验。美图与中国科学院大学联合研发的BlazeBVD算法,采用直方图辅助方法简化学习过程,提高了视频去闪烁的质量与速度。该算法通过2D网络恢复纹理,3D网络修正时间一致性,实现了高效能与高保真度。实验结果显示,BlazeBVD在多种视频类型上表现优秀,推理速度提升显著。尽管如此,算法在处理局部闪烁和复杂场景时仍存在局限性,未来有进一步优化的空间。[论文链接](https://arxiv.org/pdf/2403.06243v1)
299 1
|
前端开发 UED
登录页也酷炫:CSS动画效果,打造非凡第一印象!
登录页也酷炫:CSS动画效果,打造非凡第一印象!
|
监控 Java 中间件
蚂蚁金服:开源增强版 SpringBoot 的研发框架
蚂蚁金服:开源增强版 SpringBoot 的研发框架
255 1