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

在托盘图标中添加气球提示<script language="javascript" type="text/javascript"> document.title="在托盘图标中添加气球提示 - "+document.title </script>

    很多朋友都见到过能在托盘图标上出现气球提示的软件,不说软件,就是在“磁盘空间不足”时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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PB9以上的PB版本适用。 使用只有三个函数,很简单。 这是用PBNI编写的控件,VC6的IDE,VC2003的编译器编译,UNICODE版本。 三个函数的使用说明: of_addtip(unsignedlong winhandle, string tip) 添加一个tip。这是必须首先调用的函数,即:在使用其他两个函数前,必须先调用此函数。 winhandle:窗口句柄,操作tip的窗口的句柄,tip的图标即用此窗口的图标。 tip: tip的字符内容。 of_modifytip(string title, string info) 修改tip的内容,并且动态将修改的内容立即显示。参数的含义明显。 of_deletetip() 删除tip. 对tip图标上的鼠标操作的处理: 原理是:图标上的所有windows消息,都会转发到参数winhandle所代表的窗口,作为该窗口的WM_USER消息,即触发该窗口的pbm_custom01事件。pbm_custom01事件的lparm参数指定tip图标的windows消息号。 具体作法:在参数winhandle所代表的窗口的pbm_custom01事件写代码,检测lparm的值,以判断鼠标进行了哪种操作,如:lparm为517(WM_RBUTTONUP),表示鼠标弹起。 pbm_custom01的示例代码: //start CONSTANT long WM_MOUSEMOVE = 512 CONSTANT long WM_LBUTTONDOWN = 513 CONSTANT long WM_LBUTTONUP = 514 CONSTANT long WM_LBUTTONDBLCLK = 515 CONSTANT long WM_RBUTTONDOWN = 516 CONSTANT long WM_RBUTTONUP = 517 CONSTANT long WM_RBUTTONDBLCLK = 518 CONSTANT long WM_USER = 1024 CONSTANT long NIN_BALLOONSHOW =(WM_USER + 2) CONSTANT long NIN_BALLOONHIDE =(WM_USER + 3) CONSTANT long NIN_BALLOONTIMEOUT =(WM_USER + 4) CONSTANT long NIN_BALLOONUSERCLICK =(WM_USER + 5) m_base lm_menu CHOOSE CASE lparam CASE WM_MOUSEMOVE // CASE WM_LBUTTONDOWN //鼠标左键按下 CASE WM_LBUTTONUP //鼠标左键弹起 CASE WM_LBUTTONDBLCLK //鼠标左键双击 CASE WM_RBUTTONDOWN // SetFocus ( this ) lm_menu = CREATE m_base lm_menu.PopMenu(PointerX(),PointerY()) DESTROY lm_menu CASE WM_RBUTTONUP // CASE WM_RBUTTONDBLCLK // CASE NIN_BALLOONSHOW // CASE NIN_BALLOONHIDE // CASE NIN_BALLOONTIMEOUT // CASE NIN_BALLOONUSERCLICK // CASE ELSE Beep(0) END CHOOSE //end 注意事项: 经测试,本PBNI如果与其他非UNICODE版的PBNI同用时,会显示乱码。无解。 如有BUG,敬请及时告知。 本控件的讨论贴: http://topic.csdn.net/u/20090510/20/14a57e09-02ca-44df-8f9b-e3811678360d.html

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值