在托盘图标中添加气球提示

原创 2004年07月11日 15:32:00

    很多朋友都见到过能在托盘图标上出现气球提示的软件,不说软件,就是在“磁盘空间不足”时Windows给出的提示就属于气球提示,那么怎样在自己的程序中添加这样的气球提示呢?

    其实并不难,关键就在添加托盘图标时所使用的NOTIFYICONDATA结构,源代码如下:

窗体模块:

Option Explicit

Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

Private Type NOTIFYICONDATA
    cbSize As Long              ' 结构大小(字节)
    hwnd As Long                ' 处理消息的窗口的句柄
    uId As Long                 ' 唯一的标识符
    uFlags As Long              ' Flags
    uCallBackMessage As Long    ' 处理消息的窗口接收的消息
    hIcon As Long               ' 托盘图标句柄
    szTip As String * 128       ' Tooltip 提示文本
    dwState As Long             ' 托盘图标状态
    dwStateMask As Long         ' 状态掩码
    szInfo As String * 256      ' 气球提示文本
    uTimeoutOrVersion As Long   ' 气球提示消失时间或版本
                                ' uTimeout - 气球提示消失时间(单位:ms, 10000 -- 30000)
                                ' uVersion - 版本(0 for V4, 3 for V5)
    szInfoTitle As String * 64  ' 气球提示标题
    dwInfoFlags As Long         ' 气球提示图标
End Type

' dwState to NOTIFYICONDATA structure
Private Const NIS_HIDDEN = &H1              ' 隐藏图标
Private Const NIS_SHAREDICON = &H2          ' 共享图标

' dwInfoFlags to NOTIFIICONDATA structure
Private Const NIIF_NONE = &H0               ' 无图标
Private Const NIIF_INFO = &H1               ' "消息"图标
Private Const NIIF_WARNING = &H2            ' "警告"图标
Private Const NIIF_ERROR = &H3              ' "错误"图标

' uFlags to NOTIFYICONDATA structure
Private Const NIF_ICON As Long = &H2
Private Const NIF_INFO As Long = &H10
Private Const NIF_MESSAGE As Long = &H1
Private Const NIF_STATE As Long = &H8
Private Const NIF_TIP As Long = &H4

' dwMessage to Shell_NotifyIcon
Private Const NIM_ADD As Long = &H0
Private Const NIM_DELETE As Long = &H2
Private Const NIM_MODIFY As Long = &H1
Private Const NIM_SETFOCUS As Long = &H3
Private Const NIM_SETVERSION As Long = &H4

Private Sub Form_Load()
    ' 向托盘区添加图标
    Dim IconData As NOTIFYICONDATA
    Dim title As String
    title = "托盘程序" & vbNullChar
    With IconData
        .cbSize = Len(IconData)
        .hwnd = Me.hwnd
        .uId = 0
        .uFlags = NIF_TIP Or NIF_ICON Or NIF_MESSAGE Or NIF_INFO Or NIF_STATE
        .uCallBackMessage = WM_NOTIFYICON
        .szTip = title
        .hIcon = Me.Icon.Handle
        .dwState = 0
        .dwStateMask = 0
        .szInfo = "这是气球提示" & vbNullChar
        .szInfoTitle = title
        .dwInfoFlags = NIIF_INFO
        .uTimeoutOrVersion = 10000
    End With
    Shell_NotifyIcon NIM_ADD, IconData
    preWndProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Private Sub Form_Unload(Cancel As Integer)
    ' 删除托盘区图标
    Dim IconData As NOTIFYICONDATA
    With IconData
        .cbSize = Len(IconData)
        .hwnd = Me.hwnd
        .uId = 0
        .uFlags = NIF_TIP Or NIF_ICON Or NIF_MESSAGE
        .uCallBackMessage = WM_NOTIFYICON
        .szTip = "托盘程序"
        .hIcon = Me.Icon.Handle
    End With
    Shell_NotifyIcon NIM_DELETE, IconData
    SetWindowLong Me.hwnd, GWL_WNDPROC, preWndProc

    ' 卸载所有窗体
    Dim frm As Form
    For Each frm In Forms
        Unload frm
    Next
End Sub

标准模块:

Option Explicit

Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Const WM_RBUTTONUP = &H205
Public Const WM_USER = &H400
Public Const WM_NOTIFYICON = WM_USER + 1            ' 自定义消息
Public Const WM_LBUTTONDBLCLK = &H203
Public Const GWL_WNDPROC = (-4)

' 关于气球提示的自定义消息, 2000下不产生这些消息
Public Const NIN_BALLOONSHOW = (WM_USER + &H2)      ' 当 Balloon Tips 弹出时执行
Public Const NIN_BALLOONHIDE = (WM_USER + &H3)      ' 当 Balloon Tips 消失时执行(如 SysTrayIcon 被删除),
                                                    ' 但指定的 TimeOut 时间到或鼠标点击 Balloon Tips 后的消失不发送此消息
Public Const NIN_BALLOONTIMEOUT = (WM_USER + &H4)   ' 当 Balloon Tips 的 TimeOut 时间到时执行
Public Const NIN_BALLOONUSERCLICK = (WM_USER + &H5) ' 当鼠标点击 Balloon Tips 时执行。
                                                    ' 注意:在XP下执行时 Balloon Tips 上有个关闭按钮,
                                                    ' 如果鼠标点在按钮上将接收到 NIN_BALLOONTIMEOUT 消息。

Public preWndProc As Long

' Form1 窗口入口函数
Function WindowProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    ' 拦截 WM_NOTIFYICON 消息
    If msg = WM_NOTIFYICON Then
        Select Case lParam
            Case WM_RBUTTONUP
                ' 右键单击图标是运行这里的代码, 可以在这里添加弹出右键菜单的代码
            Case WM_LBUTTONDBLCLK
                Unload Form1
            Case NIN_BALLOONSHOW
                Debug.Print "显示气球提示"
            Case NIN_BALLOONHIDE
                Debug.Print "删除托盘图标"
            Case NIN_BALLOONTIMEOUT
                Debug.Print "气球提示消失"
            Case NIN_BALLOONUSERCLICK
                Debug.Print "单击气球提示"
        End Select
    End If
    WindowProc = CallWindowProc(preWndProc, hwnd, msg, wParam, lParam)
End Function

    源代码下载地址:http://csdngoodname008.51.net/Balloon.zip

*-------------------------------------------*<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

*  转载请通知作者并注明出处,CSDN欢迎您!   *

*  作者:卢培培(goodname008              *

*  邮箱:goodname008@163.com                *

*  专栏:http://blog.csdn.net/goodname008   *

*-------------------------------------------*

JAVA添加托盘图标和托盘弹出式菜单

很多程序在运行的过程中会在系统的托盘区域添加托盘图标,方便用户快捷操作,如QQ等,在JDK1.6及其以后的版本中,JAVA也提供了对系统托盘图标的支持。 我们以系统上的网络连接托盘图标为例,首先,我...
  • jianggujin
  • jianggujin
  • 2016年01月25日 09:44
  • 3686

【C#】关于右下角托盘图标以及气泡使用的注意事项

说实话,今天有点蛋疼了,折腾个右下角弹出气泡好半天,最后脑瓜们一亮,找到原因了吗,好气又好笑,还好过程不长,顺手记录一笔,以资纪念。 系统使用的是win10 专业版,vs使用的是2015版本,进行w...
  • z3237109
  • z3237109
  • 2016年06月12日 14:10
  • 1713

windows程序托盘图标以及消息提示--示例程序

之前两个博客介绍一些基本姿势,都是msdn上的,今天就介绍一下如何使用吧。为了简单起见,还是创建一个MFC based on dialog 功能吧。1创建托盘图标,封装了成一个函数:NOTIFYICO...
  • wangshubo1989
  • wangshubo1989
  • 2015年10月31日 14:56
  • 3108

Flex AIR 做一个类似QQ消息提示在系统托盘闪烁图标

来源:http://forum.airia.cn/archiver/FLEX/thread-14645-1.html 用Flex AIR 做一个类似QQ消息提示在系统托盘闪烁图标...
  • huanghr_1
  • huanghr_1
  • 2011年02月20日 08:14
  • 3012

修复官方duilib-添加托盘图标

注:只是添加托盘图标,不是添加托盘右键点击菜单官方duilib下载:https://github.com/duilib/duilib在使用官方duilib的时候,要添加托盘图标功能,发现不知道怎么添加...
  • xiaonaiquan
  • xiaonaiquan
  • 2017年06月24日 13:03
  • 481

MFC 托盘中添加程序图标

因为转载的这篇文章的作者也是转载的,所以找不到原作者的URL,在此只做对自己的技术储备。 1、在资源中的Icon中导入一个自己喜欢的图标,ID命名为IDR_MAINFRAME,将先前的IDR...
  • lxp116
  • lxp116
  • 2013年11月22日 14:25
  • 1827

WPF程序添加托盘图标,菜单的方法

前段时间做项目,客户需要程序最小化时到托盘,并添加托盘菜单,可以做退出,打开灯操作。 首先需要定义一个类。托盘菜单可用的。 using System; using System.Collect...
  • zx75991
  • zx75991
  • 2013年07月02日 11:00
  • 2403

windows程序托盘图标以及消息提示--基本知识(NOTIFYICONDATA)

首先介绍一下基本知识: NOTIFYICONDATA结构体,语法如下:typedef struct _NOTIFYICONDATA { DWORD cbSize; HWND hWnd; UINT u...
  • wangshubo1989
  • wangshubo1989
  • 2015年10月31日 14:17
  • 3923

MFC中提示对话框的滑动弹出和程序图标加入系统托盘的实现

还是因为无聊,下面把提示对话框的滑动弹出和程序图标加入系统托盘的实现的效果先看下: 这个就是简单的效果,下面把实现的过程简单说一下: 1.提示对话框的滑动弹出: 首先自己...
  • ylo523
  • ylo523
  • 2015年02月10日 09:02
  • 473

qt类似于qq托盘图标闪烁的消息提示

qt类似于qq托盘图标闪烁的消息提示     times=new QTimer (this);     times->setSingleShot(false);//...
  • oMingZi12345678
  • oMingZi12345678
  • 2013年12月05日 15:42
  • 1964
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在托盘图标中添加气球提示
举报原因:
原因补充:

(最多只允许输入30个字)