Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
'mdlTray.bas
'NOTIFYICONDATA.dwState
Public Const NIS_HIDDEN = &H1 ' 隐藏图标
Public Const NIS_SHAREDICON = &H2 ' 共享图标
'NOTIFYICONDATA.uFlags
Public Const NIF_ICON As Long = &H2
Public Const NIF_INFO As Long = &H10
Public Const NIF_MESSAGE As Long = &H1
Public Const NIF_STATE As Long = &H8
Public Const NIF_TIP As Long = &H4
'Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
'dwMessage
Public Const NIM_ADD As Long = &H0
Public Const NIM_MODIFY As Long = &H1
Public Const NIM_DELETE As Long = &H2
Public Const NIM_SETFOCUS As Long = &H3
Public Const NIM_SETVERSION As Long = &H4
'End Function
'Function WindowProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'msg
Public Const WM_RBUTTONUP = &H205 '单击右键
Public Const WM_RBUTTONDBLCLK = &H206 '双击右键
Public Const WM_USER = &H400 '?
Public Const WM_NOTIFYICON = WM_USER + 1 '自定义消息
Public Const WM_LBUTTONDBLCLK = &H203 '双击左键
Public Const WM_LBUTTONUP = &H202 '单击左键
'关于气球提示的自定义消息, 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 消息。
'End Function
Public 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
Public 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
'left dbl click
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
Public Sub AddIcon(ByRef IconData As NOTIFYICONDATA)
' 向托盘区添加图标
Shell_NotifyIcon NIM_ADD, IconData
preWndProc = SetWindowLong(IconData.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub DelIcon(ByRef IconData As NOTIFYICONDATA)
' 删除托盘区图标
Shell_NotifyIcon NIM_DELETE, IconData
SetWindowLong IconData.hwnd, GWL_WNDPROC, preWndProc
End Sub
Public Sub ResetIcon(ByRef IconData As NOTIFYICONDATA)
' 向托盘区修改图标
Shell_NotifyIcon NIM_MODIFY, IconData
preWndProc = SetWindowLong(IconData.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub