本程序项目包括一个模块和一个窗体1 、模块源代码为:
Option Explicit
' 强制定义每个使用的变量
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 TypePublic Const NIF_ICON = &H2
Public Const NIF_MESSAGE = &H1
Public Const NIF_TIP = &H4
Public Const NIM_ADD = &H0
Public Const NIM_DELETE =&H2
Public Const NIM_MODIFY =&H1Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" _
(ByVal dwMessage As Long , lpData As NOTIFYICONDATA ) As LongType POINTAPI
x As Long
y As Long
End Type
Type Msg
hwnd As Long
message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End Type
Public Const WM_USER = &H400
Public Const WM_RBUTTONDOWN =&H204
Public Const WM_LBUTTONDBLCLK =&H203
Public Const GWL_WNDPROC = -4
Public trayflag As Boolean'定义托盘图标是否在桌面上
Global lpPrevWndProc As Long
Global gHW As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc _
As Long , ByVal hwnd As Long , ByVal Msg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"(ByVal hwnd As Long, _
ByVal nIndex As Long , ByVal dwNewLong As Long ) As Long
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long , ByVal wParam As Long , ByVal _
lParam As Long) As Long
If hw = Form1.hwnd And uMsg = WM_USER+100 Then
'检测到鼠标点动托盘图标
Select Case lParam
Case WM_RBUTTONDOWN '鼠标右键按下
Form1.PopupMenu Form1.mainmenu '弹出菜单
Case WM_LBUTTONDBLCLK ' 鼠标左键双击
Form1.Show '显示窗口
Case Else End Select Else ' 调用缺省窗口指针
WindowProc = CallWindowProc (lpPrevWndProc , hw ,uMsg, wParam , lParam)
End If
End Function Public Sub hook ()
'将程序勾入消息环中
' 利用AddressOf 取得消息处理函数WindowProc的指针,并将其传给SetWindowLong
'lpPrevWndProc用来存储原窗口的指针
lpPrevWndProc = SetWindowLong (gHW , GWL_WNDPROC,AddressOf WindowProc)
nd Sub
Public Sub Unhook ()
' 将程序从消息环退出.用原窗口的指针替换WindowProc函数的指针,即关闭子类、退出消息循环
Dim temp As Long
temp = SetWindowLong (gHW , GWL_WNDPROC, lpPrevWndProc )
End Sub
2 、在窗口form1 加入一个主菜单mainmenu,设置为不可见。在加
入一些子菜单如
" 显示窗口" (名称为:show)
" 隐藏窗口" (名称为:hide)
" 退出程序" (名称为:exit)
在加入四个按钮
Command1,Command2,Command3,Command.caption
属性分别为:“删除托盘图标" ,”创建托盘图标" ,“修改托盘图标" ,”退出程序".
代码窗口的内容为:Dim MyNot As NOTIFYICONDATA ' 定义一个托盘结构Private Sub Command1_Click() '按下删除托盘图标按钮
With MyNot
.hIcon = Form1.Icon '托盘图标指针指向窗口的图标.
.hwnd = Form1.hwnd ' 窗体指针
.szTip = ""'弹出提示字符串,删除时应为空
.uCallbackMessage = WM_USER + 100'对应程序定义的消息
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE' 图标标志
.uID = 1' 图标识别符。cbSize = Len(MyNot )'计算结构实例MyNot 的长度
End With
hh = Shell_NotifyIcon(NIM_DELETE, MyNot) ' 删除该托盘图标
trayflag = False'托盘图标删除后trayflag为假
End SubPrivate Sub Command2_Click()'按下创建托盘图标按钮
Dim hh As Long
With MyNot
.hIcon = Form1.Icon
.hwnd = Form1.hwnd
.szTip = " 托盘图标" & Chr(&H0)
.uCallbackMessage = WM_USER+ 100
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
.uID = 1
.cbSize = Len(MyNot )
End With
hh = Shell_NotifyIcon(NIM_ADD , MyNot)'添加一个托盘图标
trayflag = True' 托盘图标添加后trayflag为真
End Sub Private Sub Command3_Click()'按下修改托盘图标按钮
Dim hh As Long Set P = LoadPicture("cd.ico") ' 导入一个新图标
With MyNot
.hIcon = P' 将托盘图标改为新图标
.hwnd = Form1.hwnd
.szTip = " 光盘图标" & Chr(&H0)'更改提示信息
.uCallbackMessage = WM_USER + 100
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
.uID = 1
.cbSize = Len (MyNot )
End With
hh = Shell_NotifyIcon(NIM_MODIFY, MyNot)'修改托盘图标的某些特征
End Sub Private Sub Command4_Click()'退出窗口按钮被按下
If trayflag = True Then Command1_Click' 如果托盘图标仍在,模拟按下" 删除托盘图标" 按钮
Unhook'退出消息循环
Unload Me' 卸载窗体
End Sub Private Sub exit_Click()
If trayflag = True Then Command1_Click'如果托盘图标仍在,模拟按下“删除托盘图标" 按钮Unhook'退出消息循环
Unload Me' 卸载窗体
End Sub
Private Sub Form_Load ()
gHW = Me.hwnd' 取得本窗体指针
hook'调用钩子函数,将自制消息处理函数钩入 Windows 的消息循环
End Sub Private Sub hide_Click()
Form1.hide'隐藏窗口
End Sub Private Sub show_Click()
Form1.show'显示窗口
End Sub
Option Explicit
' 强制定义每个使用的变量
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 TypePublic Const NIF_ICON = &H2
Public Const NIF_MESSAGE = &H1
Public Const NIF_TIP = &H4
Public Const NIM_ADD = &H0
Public Const NIM_DELETE =&H2
Public Const NIM_MODIFY =&H1Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" _
(ByVal dwMessage As Long , lpData As NOTIFYICONDATA ) As LongType POINTAPI
x As Long
y As Long
End Type
Type Msg
hwnd As Long
message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End Type
Public Const WM_USER = &H400
Public Const WM_RBUTTONDOWN =&H204
Public Const WM_LBUTTONDBLCLK =&H203
Public Const GWL_WNDPROC = -4
Public trayflag As Boolean'定义托盘图标是否在桌面上
Global lpPrevWndProc As Long
Global gHW As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc _
As Long , ByVal hwnd As Long , ByVal Msg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"(ByVal hwnd As Long, _
ByVal nIndex As Long , ByVal dwNewLong As Long ) As Long
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long , ByVal wParam As Long , ByVal _
lParam As Long) As Long
If hw = Form1.hwnd And uMsg = WM_USER+100 Then
'检测到鼠标点动托盘图标
Select Case lParam
Case WM_RBUTTONDOWN '鼠标右键按下
Form1.PopupMenu Form1.mainmenu '弹出菜单
Case WM_LBUTTONDBLCLK ' 鼠标左键双击
Form1.Show '显示窗口
Case Else End Select Else ' 调用缺省窗口指针
WindowProc = CallWindowProc (lpPrevWndProc , hw ,uMsg, wParam , lParam)
End If
End Function Public Sub hook ()
'将程序勾入消息环中
' 利用AddressOf 取得消息处理函数WindowProc的指针,并将其传给SetWindowLong
'lpPrevWndProc用来存储原窗口的指针
lpPrevWndProc = SetWindowLong (gHW , GWL_WNDPROC,AddressOf WindowProc)
nd Sub
Public Sub Unhook ()
' 将程序从消息环退出.用原窗口的指针替换WindowProc函数的指针,即关闭子类、退出消息循环
Dim temp As Long
temp = SetWindowLong (gHW , GWL_WNDPROC, lpPrevWndProc )
End Sub
2 、在窗口form1 加入一个主菜单mainmenu,设置为不可见。在加
入一些子菜单如
" 显示窗口" (名称为:show)
" 隐藏窗口" (名称为:hide)
" 退出程序" (名称为:exit)
在加入四个按钮
Command1,Command2,Command3,Command.caption
属性分别为:“删除托盘图标" ,”创建托盘图标" ,“修改托盘图标" ,”退出程序".
代码窗口的内容为:Dim MyNot As NOTIFYICONDATA ' 定义一个托盘结构Private Sub Command1_Click() '按下删除托盘图标按钮
With MyNot
.hIcon = Form1.Icon '托盘图标指针指向窗口的图标.
.hwnd = Form1.hwnd ' 窗体指针
.szTip = ""'弹出提示字符串,删除时应为空
.uCallbackMessage = WM_USER + 100'对应程序定义的消息
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE' 图标标志
.uID = 1' 图标识别符。cbSize = Len(MyNot )'计算结构实例MyNot 的长度
End With
hh = Shell_NotifyIcon(NIM_DELETE, MyNot) ' 删除该托盘图标
trayflag = False'托盘图标删除后trayflag为假
End SubPrivate Sub Command2_Click()'按下创建托盘图标按钮
Dim hh As Long
With MyNot
.hIcon = Form1.Icon
.hwnd = Form1.hwnd
.szTip = " 托盘图标" & Chr(&H0)
.uCallbackMessage = WM_USER+ 100
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
.uID = 1
.cbSize = Len(MyNot )
End With
hh = Shell_NotifyIcon(NIM_ADD , MyNot)'添加一个托盘图标
trayflag = True' 托盘图标添加后trayflag为真
End Sub Private Sub Command3_Click()'按下修改托盘图标按钮
Dim hh As Long Set P = LoadPicture("cd.ico") ' 导入一个新图标
With MyNot
.hIcon = P' 将托盘图标改为新图标
.hwnd = Form1.hwnd
.szTip = " 光盘图标" & Chr(&H0)'更改提示信息
.uCallbackMessage = WM_USER + 100
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
.uID = 1
.cbSize = Len (MyNot )
End With
hh = Shell_NotifyIcon(NIM_MODIFY, MyNot)'修改托盘图标的某些特征
End Sub Private Sub Command4_Click()'退出窗口按钮被按下
If trayflag = True Then Command1_Click' 如果托盘图标仍在,模拟按下" 删除托盘图标" 按钮
Unhook'退出消息循环
Unload Me' 卸载窗体
End Sub Private Sub exit_Click()
If trayflag = True Then Command1_Click'如果托盘图标仍在,模拟按下“删除托盘图标" 按钮Unhook'退出消息循环
Unload Me' 卸载窗体
End Sub
Private Sub Form_Load ()
gHW = Me.hwnd' 取得本窗体指针
hook'调用钩子函数,将自制消息处理函数钩入 Windows 的消息循环
End Sub Private Sub hide_Click()
Form1.hide'隐藏窗口
End Sub Private Sub show_Click()
Form1.show'显示窗口
End Sub
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货