托盘图标(NotifyIcon)详解

Windows xp下的托盘功能实现起来很简单,但如果要做一些高级一点的实现效果,以及良好的UI友好操作,那就需要下一小番功夫了。这里没有采用自己创建Tip窗口的方式,而是使用windows自带的Shell_NotifyIcon来完成一些还算Ok的效果。

托盘中我们经常要显示提示,NOTIFYICONDATA中给了我们相应的参数。个人建议使用InfoTip。而不要采用最简单的Tip。首先是InfoTip美观,其次InfoTip灵活,可以设置提示的标题和提示的内容,且内容允许多行。那么如果我们要实现一个标准的托盘加InfoTip提示功能,并具有良好的交互性,就需要封装一下NotifyIcon,使其具一些标准功能。

  1. 允许设定鼠标停留在托盘上显示提示的延时,这个延时即鼠标停留在托盘上多久才显示托盘。
  2. 在提示显示时,能动态更新提示内容。
  3. 点击提示窗口或者提示关闭按钮后关闭提示。
  4. 在设置鼠标离开托盘图盘后多长时间提示关闭。
  5. 当鼠标右击托盘时能弹出菜单。如果托盘上已经显示提示,右击托盘弹出菜单时,应该能隐藏或者关闭提示。

如果以上功能能得到良好实现,那么算是一个标准的托盘功能。本文将介绍使用Shell_NotifyIcon函数,来实现以上功能的方法。

由于源代码不在旁边,这边把主要思路和需要注意的地方说一下。

 

首先创建一个托盘我们使用Shell_NotiryIcon( NM_ADD, &ni );其中ni中我们使用NIF_INFO.具体如何使用气泡提示,从MSDN中我们可以查找。

如果我们想要在气泡弹出的时间段内动态的更新气泡提示的内容,那么我们需要使用Shell_NotifyIcon( NIM_MODIFY, &ni );去修改提示的内容。

虽然气泡提起会自己消失,但微软使其延迟消失时间规定为最少是10秒(好像)。所以如果我们想动态设置延迟消失时间,需要我们自己来实现。具体的方法可以使自己创建一个时间线程或者其他能不断被调用的函数,在函数中检测超时,时间到了就使用Shell_NotifyIcon( NIM_MODIFY, &ni );隐藏提示。方法就是去掉NIF_INFO这个格式即可。

另外还会涉及一些其他细节,当我们右击托盘的时候,提示应该消失,因为不消失会使得菜单和气泡重叠,不够美观。具体方法因人而异。

还有需要处理一些和气泡相关的消息,我们应该实现,点击气泡提示,气泡提示会隐藏,这个我们就需要处理NIN_BALLOONUSERCLICK消息。

这里有一个很需要注意的地方是,使用Shell_notifyIcon( NIM_MODIFY, &ni );时,托盘会发出NIN_TIMEOUT消息,但是如果你想实现点击气泡上关闭按钮关闭气泡时,你也需要处理NIN_TIMEOUT消息,这样的话,我们需要定义一个变量,每调用一次Shell_NotifyIcon( NIM_MODIFY, &ni );的时候都设置一次,表明当前NIN_TIMEOUT消息是由于Shell_Notify引起的,那么就不处理NIN_TIMEOUT,如果此变量没被设置,证明用户点击了气泡提示的关闭按钮。

 

时间: 2024-09-05 05:25:58

托盘图标(NotifyIcon)详解的相关文章

详解Python中的type()方法的使用

  这篇文章主要介绍了详解Python中的type()方法的使用,是Python入门中的基础知识,需要的朋友可以参考下 type()方法返回传递变量的类型.如果传递变量是字典那么它将返回一个字典类型. 语法 以下是type()方法的语法: ? 1 type(dict) 参数 dict -- 这是字典 返回值 此方法返回传递变量的类型. 例子 下面的例子显示type()方法的使用 ? 1 2 3 4 #!/usr/bin/python   dict = {'Name': 'Zara', 'Age'

【转】java枚举使用详解

在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的"数据集",春夏秋冬四个数据元素组成了四季的"数据集". 在Java中如何更好的使用这些"数据集"呢?因此枚举便派上了用场,以下代码详细介绍了枚举的用法. Java代码   package com.ljq.test;      /**   * 枚举用法详解   *

状态模式(state pattern) 详解

状态模式(state pattern): 允许对象在内部状态改变时改变它的行为, 对象看起来好像修改了它的类. 建立Context类, 包含多个具体状态(concrete state)类的组合, 根据状态的不同调用具体的方法, state.handle(), 包含set\get方法改变状态. 状态接口(state interface), 包含抽象方法handle(), 具体状态类(concrete state)继承(implement)状态类(state), 实现handle()方法; 具体方法

kafka详解一、Kafka简介

背景:      当今社会各种应用系统诸如商业.社交.搜索.浏览等像信息工厂一样不断的生产出各种信息,在大数据时代,我们面临如下几个挑战: 如何收集这些巨大的信息 如何分析它        如何及时做到如上两点      以上几个挑战形成了一个业务需求模型,即生产者生产(produce)各种信息,消费者消费(consume)(处理分析)这些信息,而在生产者与消费者之间,需要一个沟通两者的桥梁-消息系统.      从一个微观层面来说,这种需求也可理解为不同的系统之间如何传递消息. Kafka诞生

Cocos2d-x win7 + vs2010 配置图文详解

Cocos2d-x win7 + vs2010 配置图文详解(亲测)   下载最新版的cocos2d-x.打开浏览器,输入cocos2d-x.org,然后选择Download,本教程写作时最新版本为cocos2d-1.01-x-0.9.1,具体下载位置如下图: 下载完之后,解压到当前文件夹.我把下载的程序放在F盘根目录,解压完毕之后,双击打开文件夹,看看里面有什么东西,红圈部分就是我们要安装使用的文件: 接下来,我们正式安装cocos2d-x到win7中去. 首先,双击上图中的cocos2d-w

ip-《TCP/IP 详解卷一》中90页中讲到,“由于子网号不相同,代理ARP不能使用”,这怎么理解?

问题描述 <TCP/IP 详解卷一>中90页中讲到,"由于子网号不相同,代理ARP不能使用",这怎么理解? <TCP/IP 详解卷一>中90页中讲到,"由于子网号不相同,代理ARP不能使用",这怎么理解? 解决方案 ARP主要用在一个子网中,用MAC地址来通信.数据链路层 不同子网,需要通过三层路由 解决方案二: 比如 N1 <-> GW <-> N2,N1和N2是同一个子网,GW上开启arp代理的效果是,N1和N2上

JS表格组件神器bootstrap table详解(基础版)_javascript技巧

一.Bootstrap Table的引入 关于Bootstrap Table的引入,一般来说还是两种方法: 1.直接下载源码,添加到项目里面来. 由于Bootstrap Table是Bootstrap的一个组件,所以它是依赖Bootstrap的,我们首先需要添加Bootstrap的引用. 2.使用我们神奇的Nuget 打开Nuget,搜索这两个包 Bootstrap已经是最新的3.3.5了,我们直接安装即可. 而Bootstrap Table的版本竟然是0.4,这也太坑爹了.所以博主建议Boot

网页文字该多大?文字字号详解

网页|详解 文字在网页上的应用: (只看小标题您就能知道这一部分要说什么了,为了避免罗嗦,在此文发布前决定把此处300余字删除,只保留了下面这一句.) 对于一个设计的好的网站来说,用户浏览时间最长的是文章正文. 中文网页文字的现状: 中文网页普遍使用12px和14px的宋体(simsun),这两种文字都可以加粗(font-weight: bold).这个规范似乎也成了网页设计师的基本 常识. 中国的网页设计师有这4种可供选择的文字表现方式,仅仅是4种,只有这4种,4种很小的文字.其中12px的宋

php-fpm配置详解

 这篇文章主要介绍了php-fpm配置详解,需要的朋友可以参考下 php5.3自带php-fpm   代码如下: /usr/local/php/etc/php-fpm.conf     pid = run/php-fpm.pid pid设置,默认在安装目录中的var/run/php-fpm.pid,建议开启   error_log = log/php-fpm.log 错误日志,默认在安装目录中的var/log/php-fpm.log   log_level = notice 错误级别. 可用级别