Dim IconVa As NOTIFYICONDATA
Dim L As Long
NIM_DELETE=2
With IconVa
.hwnd = iHwnd
.uId = lIndex
.cbSize = Len(IconVa)
End With
Icon_Del = Shell_NotifyIcon(NIM_DELETE, IconVa)
...全文
28613打赏收藏
托盘程序的图标为什么无法删除?
Dim IconVa As NOTIFYICONDATA Dim L As Long NIM_DELETE=2 With IconVa .hwnd = iHwnd .uId = lIndex .cbSize = Len(IconVa) End With Icon_Del = Shell_NotifyIcon(NIM_DELETE, IconVa)
to :weiym(浙江征服者联盟(CAZ))
Dim h As Long
Shell_NotifyIcon NIM_DELETE, myData '窗口卸载时,将状态栏中的图标一同卸载
h = FindWindow("ToolbarWindow32", vbNullString)
If (h <> 0) Then
SendMessage h, WM_PAINT, 0, 0
End If
还是不行呀,还是不能立刻在托盘中反应出来
删除托盘后用下面的方法刷新一下
Option Explicit
Private Const WM_PAINT = &HF
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Sub Command1_Click()
Dim h As Long
h = 0
h = FindWindow("ToolbarWindow32", vbNullString)
If (h <> 0) Then
SendMessage h, WM_PAINT, 0, 0
End If
End Sub
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
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal HWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Function NewWindowProc(ByVal HWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'如果用户点击了托盘中的图标,则进行判断是点击了左键还是右键
If Msg = TRAY_CALLBACK Then
'如果点击了左键
If lParam = WM_LBUTTONUP Then
'而这时窗体的状态是最小化时
If TheForm.WindowState = vbMinimized Then _
'恢复到最小化前的窗体状态
TheForm.WindowState = TheForm.LastState
TheForm.SetFocus
Exit Function
End If
End If
'如果点击了右键
If lParam = WM_RBUTTONUP Then
'则弹出右键菜单
TheForm.PopupMenu TheMenu
Exit Function
End If
End If
'如果是其他类型的消息则传递给原有默认的窗口函数
NewWindowProc = CallWindowProc(OldWindowProc, HWnd, Msg, wParam, lParam)
End Function 这样我们就取得并处理了来自托盘图标的消息,现在的问题是在鼠标右键菜单弹出后,怎么控制程序主窗体的状态,这时我们需要用到SendMessage函数来向主窗体发送最大化、最小化、关闭、移动等消息,具体的代码实现如下,其中HWnd是主窗体的句柄,WM_SYSCOMMAND表示发送的是系统控制类的消息,SC_MOVE、SC_SIZE、SC_RESTORE便是要发送的消息了:
'托盘图标右键菜单上的“移动”项被点击时
Private Sub mnuTrayMove_Click()
SendMessage HWnd, WM_SYSCOMMAND, SC_MOVE, 0&
End Sub
'托盘图标右键菜单上的“恢复”项被点击时
Private Sub mnuTrayRestore_Click()
SendMessage HWnd, WM_SYSCOMMAND, SC_RESTORE, 0&
End Sub
'托盘图标右键菜单上的“退出”项被点击时
Private Sub mnuTraySize_Click()
SendMessage HWnd, WM_SYSCOMMAND, SC_SIZE, 0&
End Sub
程序(附后)用到了Shell_NotifyIcon、SendMessage、CallWindowProc、SetWindowLong等API函数,其中Shell_NotifyIcon是主要的函数,它用来添加、删除、更改系统托盘区(taskbar status area)的图标,所以我们先来看看这个函数的声明和参数:
使用API函数之前必须先在程序中声明如下:
Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
cbSize As Long 需填入NOTIFYICONDATA数据结构的长度
HWnd As Long 设置成窗口的句柄
Uid As Long 为图标所设置的ID值
UFlags As Long 设置uCallbackMessage,hIcon,szTip是否有效
UCallbackMessage As Long 消息编号
HIcon As Long 显示在状态栏上的图标
SzTip As String * 64 提示信息
End Type
返回值 Long,非零表示成功,零表示失败
在使用这个API函数之前我们应该先定义结构类型NOTIFYICONDATA:
Public 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
然后定义一个NOTIFYICONDATA的变量TheData来记录设置托盘图标的数据
Private TheData As NOTIFYICONDATA
这时我们就可以使用这个函数来设置系统托盘图标了,具体方法如下:
1、添加图标
With TheData
.Uid = 0
.HWnd = frm.HWnd 'frm.HWnd是程序主窗体的句柄
.cbSize = Len(TheData)
.HIcon = frm.Icon.Handle 'frm.Icon.Handle指向主窗体的图标
.UFlags = NIF_ICON
.UCallbackMessage = TRAY_CALLBACK
'作用是允许返回消息,在下一节中会有详细解释。
.UFlags = .UFlags Or NIF_MESSAGE
.cbSize = Len(TheData)
End With
Shell_NotifyIcon NIM_ADD, TheData
'根据前面定义NIM_ADD,设置为“添加模式”,然后添加
2、删去图标
With TheData
.UFlags = 0
End With
Shell_NotifyIcon NIM_DELETE, TheData
'根据前面定义NIM_DELETE,设置为“删除模式”
3、更改图标
With TheData
.HIcon = pic.Handle
'pic是图片狂PictureBox,存放图标文件
.UFlags = NIF_ICON
End With
Shell_NotifyIcon NIM_MODIFY, TheData
'根据前面定义NIM_MODIFY,设置为“更改模式”
4、为图标添加浮动提示信息
With TheData
.SzTip = tip & vbNullChar
'tip是字符串string,存储提示信息
.UFlags = NIF_TIP
'指明要对浮动提示进行设置
End With
Shell_NotifyIcon NIM_MODIFY, TheData
'根据前面定义NIM_MODIFY,设置为“修改模式”