关于NotifyIcon的抱怨。。。

.NET中微软提供了NotifyIcon类来处理应用程序在托盘区的图标显示,并且该对象可以设置一个ContextMenu对象,方便应用程序进行快捷操作。但是,ContextMenu是以右键点击的方式弹出来的,而实际开发中用户经常要求左键单击的时候也能够弹出菜单进行操作,可是微软在NotifyIcon中并没有提供相应的方法来设置,仅有的一个ContextMenu.Show方法也因为NotifyIcon不是Control对象而苦难重重。

到底是怎么回事,难道是微软不推荐我们这样操作?GOOGLE了一下,这个问题还真不少,有一个人的观点很有趣:他说从界面设计角度来说,右键是默认的、众所周知的、被期望的操作方法,而很多开发者却想方设法来破坏这些规则,因此他拒绝帮助别人处理此问题。看了之后觉得很气愤,不错,我们愿意遵循众所周知的界面操作方式以提供用户一致的界面体验,为了验证在NotifyIcon对象上的默认操作方式,我考察了其它第三方软件的处理方式,以我电脑上正在运行的程序为例,分析结果如下:

  • MSN Messenger的NotifyIcon在左键和右键单击时,均弹出相同的菜单。
  • Outlook的NotifyIcon在左键和右键单击时,均弹出相同的菜单。
  • ActiveSync的NotifyIcon在左键和右键单击时,均弹出相同的菜单。
  • Windows Security Alerts,在左键单击时直接激活程序界面,右键单击弹出菜单。

看看吧,4款微软自家的产品,处理的方式也不完全相同,按照少数服从多数的原则,在左键单击时应该也弹出相同的菜单。

DEEP SHIT! 微软简直是在玩我们,.net框架在处理win32的时候,不应当仅仅是简单的封装和不负责任的改进。

那么,让我们GOOGLE一下看是否有相应的解决方法吧。

首先是从ContextMenu.Show入手,网上的分析是使用该函数可以把菜单正确弹出来,但确无法关闭此菜单,而且似乎是没有办法来解决,除非添加一个“关闭”项,强迫用户点击。

另一方面,搜索到一个利用反射的方法来完美处理的方法,代码如下,具体原理我也不想研究了。

Type t = typeof(NotifyIcon);
MethodInfo mi = t.GetMethod("ShowContextMenu", BindingFlags.NonPublic | BindingFlags.Instance);
mi.Invoke(this.notifyIcon1, null);

晕,居然是反射调用Private方法,真是服了,幸亏微软没有完全把路毒死,否则肯定有人找它拼命!

转载于:https://www.cnblogs.com/swnuwangyun/archive/2007/03/30/694357.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值