📄 mod托盘模块.bas
字号:
Attribute VB_Name = "mod托盘模块"
'本模块是有关系统托盘的
Option Explicit
Const NIM_ADD = 0 '加入图标到系统状态区中
Const NIM_MODIFY = 1 '修改系统状态区的图标
Const NIM_DELETE = 2 '删除系统状态区的图标
Const NIF_MESSAGE = 1 '消息
Const NIF_ICON = 2 '设置图标
Const NIF_TIP = 4 '提示
Type NOTIFYICONDATA '定义系统状态区的图标
cbSize As Long
hWnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * 64
End Type
Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long '建立系统状态区的图标
Const GWL_WNDPROC = (-4) '窗口函数的地址
Const WM_USER = &H400
Const WM_MOUSEFIRST = &H200 '鼠标移动时发生,比 WM_MOUSEMOVE 要早
Const WM_MOUSEMOVE = &H200 '鼠标移动时发生
Const WM_LBUTTONDOWN = &H201 '鼠标左键按下时发生
Const WM_LBUTTONUP = &H202 '鼠标左键放开时发生
Const WM_LBUTTONDBLCLK = &H203 '鼠标左键双击时发生
Const WM_RBUTTONDOWN = &H204 '鼠标右键按下时发生
Const WM_RBUTTONUP = &H205 '鼠标右键放开时发生
Const WM_RBUTTONDBLCLK = &H206 '鼠标右键双击时发生
Const WM_MBUTTONDOWN = &H207 '中间键按下时发生
Const WM_MBUTTONUP = &H208 '中间键放开时发生
Const WM_MBUTTONDBLCLK = &H209 '中间键双击时发生
Const WM_ENDSESSION = &H16
Const WM_QUERYENDSESSION = &H11
Public tray_win As Long '保存窗口的变量
Public tray_nid As NOTIFYICONDATA '定义系统区图标
Public tray_IsWinAddress As Boolean '是否取得窗口信息的判断
Public WM_TASKBARCREATED As Long
Const uID = 9998
Const tray_uMessage = WM_USER + 100
'Msg 传过来的是区域(如果工作区、标题区、系统状态区等等) lParam 传过来的是消息(如鼠标左键点击、右键点击等等) wParam 自己感觉没有多大的用处,通过前面传过来的信息,进行判断处理
Function trayWndProc(ByVal hWnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lHwnd As Long
If MSG = WM_USER + 100 Then
Select Case lParam '下面是大部分的鼠标操作,你可根据所需的事件,定义自己的操作
Case WM_MOUSEFIRST '鼠标移动时发生,比 WM_MOUSEMOVE 要早
Case WM_MOUSEMOVE '鼠标移动时发生
Case WM_LBUTTONDOWN, WM_RBUTTONDOWN '鼠标左键按下时发生'鼠标右键按下时发生
Case WM_LBUTTONUP '鼠标左键放开时发生
Case WM_LBUTTONDBLCLK '鼠标左键双击时发生
frmMain.Show
Case WM_RBUTTONUP '鼠标右键放开时发生
Case WM_RBUTTONDBLCLK '鼠标右键双击时发生
Case WM_MBUTTONDOWN '中间键按下时发生
Case WM_MBUTTONUP '中间键放开时发生
Case WM_MBUTTONDBLCLK '中间键双击时发生
End Select
End If
If MSG = WM_QUERYENDSESSION Then '关闭系统
Else
If MSG = WM_ENDSESSION Then '正常关闭
End If
End If
If MSG = WM_TASKBARCREATED Then
SetTrayIcon frmMain.Icon, "四方图程序", "Add"
End If
trayWndProc = CallWindowProc(tray_win, hWnd, MSG, wParam, lParam) '将消息传送给指定的窗口
End Function
Function SetTrayIcon(ByVal Icon As Long, ByVal tIp As String, ByVal Action As String)
If tray_IsWinAddress = False Then '判断是否需要取得窗口信息,如果重复取得,将会造成程序死掉
tray_win = GetWindowLong(frmMain.hWnd, GWL_WNDPROC) '取得(备份)窗口信息
SetWindowLong frmMain.hWnd, GWL_WNDPROC, AddressOf trayWndProc '设置新的窗口信息
End If
tray_nid.cbSize = Len(tray_nid) '取数据结构的长度设置给 cbSize
tray_nid.hWnd = frmMain.hWnd '设置图标的句柄,这里为本窗口的
tray_nid.uID = 9999
tray_nid.uFlags = NIF_ICON + NIF_TIP + NIF_MESSAGE '设置图标、提示、消息
tray_nid.hIcon = Icon '图标
tray_nid.szTip = tIp + Chr(0) '图标提示
tray_nid.uCallbackMessage = tray_uMessage
Select Case Action
Case "Add"
Shell_NotifyIcon NIM_ADD, tray_nid '加入图标到系统状态区中
Case "Del"
Shell_NotifyIcon NIM_DELETE, tray_nid '删除系统区的图标
Case "Modi"
Shell_NotifyIcon NIM_MODIFY, tray_nid '修改系统区的图标
Case "Exit"
Shell_NotifyIcon NIM_DELETE, tray_nid '删除系统区的图标
SetWindowLong frmMain.hWnd, GWL_WNDPROC, tray_win '恢复窗口信息
End Select
tray_IsWinAddress = True '不需要再取得窗口信息
End Function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -