vb右键点击托盘的图标弹出菜单,怎样实现?
http://zhidao.baidu.com/question/194892077.html?fr=qrl&cid=93&index=4&fr2=query的回答很好。...
http://zhidao.baidu.com/question/194892077.html?fr=qrl&cid=93&index=4&fr2=query的回答很好。不过,我想右键点击托盘的图标弹出菜单,在这个基础上怎样实现?
展开
2个回答
展开全部
注意事项:一定记得建立菜单并且名称必须和代码中的一致或者修改代码中的名称否则会有错误提示,在代码最后有一段代码,把这段代码复制到窗体代码里面取消注释即可
建立步骤:
1.新建一个工程,设置窗体的属性
BoarderStyle为1-Fixed single
MinButton为true
ShowIntaskbar为false
把下文的窗体代码内容复制到工程的窗体代码框;
2.工程添加一个模块并把文中的模块代码复制到模块代码里;
3.右键点击窗体选择菜单编辑器,在名称中输入mnuTray,标题为“右键菜单”,可见复选框设为非选择状态;点击下一个,点击右箭头,在名称里输入mnuTrayexit,标题为“退出”;最后点击确定。
4.点击工具栏中的启动按钮,运行程序;
5.点击最小化键,在托盘显示出图标并隐藏了窗口即:最小化到系统状态栏。右键点击一下托盘图标,弹出菜单。左键点击托盘图标窗口还原。
更改托盘图标:
方法一:设置工程窗体的图标,即在窗体的属性中的Icon中选择自定义的*.ico文件。代码中使用的是窗体的图标;
方法二:使用一个图片框存储图标,并把图片框的句柄赋给Thedata中的HIcon即可,在with....end with中修改或直接Thedata.HIcon=...即可。
TheData.HIcon = Picture1.Picture.Handle'把图片框的图片句柄赋给TheData.HIcon
Shell_NotifyIcon NIM_MODIFY, TheData
动态显示托盘图标:
添加定时器,每到定时值触发一次事件更换图标;重新设置Thedata.HIcon为新的图标然后使用 Shell_NotifyIcon NIM_MODIFY, TheData 修改图标显示。
***************************************模块代码***********************************************
Option Explicit
Public OldWindowProc As Long
Public TheForm As Form
Public TheMenu As Menu
Public Const WM_USER = &H400
Public Const WM_LBUTTONUP = &H202 '左键消息编号
Public Const WM_MBUTTONUP = &H208 '中键消息编号
Public Const WM_RBUTTONUP = &H205 '右键消息编号
Public Const TRAY_CALLBACK = (WM_USER + 1001&) '消息编号
Public Const GWL_WNDPROC = (-4)
Public Const NIF_ICON = &H2 '
Public Const NIF_TIP = &H4
Public Const NIF_MESSAGE = &H1
Public Const NIM_ADD = &H0
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2
Public Type NOTIFYICONDATA '定义结构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
Public TheData As NOTIFYICONDATA '定义结构对象TheData
Public 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
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) 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
RemoveTray
TheForm.WindowState = vbNormal
TheForm.Show
TheForm.SetFocus
Exit Function
End If
End If
If lParam = WM_RBUTTONUP Then
SetForegroundWindow TheForm.hwnd '按下右键时使窗体获得焦点,这也可以使用TheForm.SetFocus代替以实现右键菜单弹出后不能消失的问题
TheForm.PopupMenu TheMenu '弹出菜单
Exit Function
End If
End If
NewWindowProc = CallWindowProc(OldWindowProc, hwnd, Msg, wParam, lParam) '把原来消息函数的消息传递给自定义的消息函数
End Function
Public Sub SetTray() '调用此子过程添加托盘图标
OldWindowProc = SetWindowLong(TheForm.hwnd, GWL_WNDPROC, AddressOf NewWindowProc) '设置新的自定义消息循环函数以进行左、右键按键处理
'存储原来消息函数地址到OldWindowProc
With TheData
.Uid = 0
.hwnd = TheForm.hwnd
.cbSize = Len(TheData)
.HIcon = TheForm.Icon.Handle
.UFlags = NIF_ICON
.UCallbackMessage = TRAY_CALLBACK
.UFlags = .UFlags Or NIF_MESSAGE Or NIF_TIP
.SzTip = "右键退出菜单" & vbNullChar
.cbSize = Len(TheData)
End With
Shell_NotifyIcon NIM_ADD, TheData '显示托盘图标
End Sub
Public Sub Minimized() '调用此子过程最小化隐藏窗体
If TheForm.WindowState = vbMinimized Then TheForm.Hide
End Sub
Public Sub RemoveTray() '调用此子过程删除托盘图标
With TheData
.UFlags = 0
End With
Shell_NotifyIcon NIM_DELETE, TheData '删除托盘图标
SetWindowLong TheForm.hwnd, GWL_WNDPROC, OldWindowProc '恢复消息循环函数为原有的
End Sub
*************************************代码结束*************************************************
'模块说明:模块包括建立托盘图标,删除托盘图标,最小化隐藏窗体,自定义消息循环函数
'Settray子过程:功能为建立托盘图标,即调用此过程会设置自定义消息循环函数并建立托盘图标以及右键弹出菜单
'Minimized子过程:功能为最小化时隐藏TheForm窗体
'RemoveTray子过程:功能为删除托盘图标并恢复消息循环函数为原来函数
'在窗体上应该使用菜单编辑器编辑一个菜单mnuTray并建立其子菜单mnuTrayexit (退出),在mnuTrayexit (退出)的click事件里应该调用RemoveTray子过程并unload me;
'TheForm 在开始时(Formload过程)应该指定为窗体Me;TheMenu在开始时(Formload过程)应该指定为菜单名称mnuTray;
'为实现最小化时托盘显示应该在Form_Resize过程中隐藏窗体并调用Settray子过程以及Minimized子过程以建立托盘图标并隐藏窗体
'以下为基本的建立托盘图标的过程代码
*************************************窗体代码内容*********************************************
Private Sub Form_Load()
Set TheForm = Me '窗体
Set TheMenu = mnuTray '菜单名称,一定要建立菜单且名称必须与代码的一致
'代码中的菜单名称为mnuTray,标题自定义,mnuTray的子菜单为弹出来的菜单例中只建立了一个子菜单mnuTrayexit
End Sub
Private Sub Form_Resize()
If TheForm.WindowState = vbMinimized Then
SetTray '调用过程显示托盘图标
Minimized '调用过程最小化隐藏窗体,效果为最小化到托盘
End If
End Sub
Private Sub mnuTrayexit_Click()
RemoveTray '调用过程删除托盘图标
Unload TheForm '卸载窗体
End Sub
*************************************代码结束*************************************************
建立步骤:
1.新建一个工程,设置窗体的属性
BoarderStyle为1-Fixed single
MinButton为true
ShowIntaskbar为false
把下文的窗体代码内容复制到工程的窗体代码框;
2.工程添加一个模块并把文中的模块代码复制到模块代码里;
3.右键点击窗体选择菜单编辑器,在名称中输入mnuTray,标题为“右键菜单”,可见复选框设为非选择状态;点击下一个,点击右箭头,在名称里输入mnuTrayexit,标题为“退出”;最后点击确定。
4.点击工具栏中的启动按钮,运行程序;
5.点击最小化键,在托盘显示出图标并隐藏了窗口即:最小化到系统状态栏。右键点击一下托盘图标,弹出菜单。左键点击托盘图标窗口还原。
更改托盘图标:
方法一:设置工程窗体的图标,即在窗体的属性中的Icon中选择自定义的*.ico文件。代码中使用的是窗体的图标;
方法二:使用一个图片框存储图标,并把图片框的句柄赋给Thedata中的HIcon即可,在with....end with中修改或直接Thedata.HIcon=...即可。
TheData.HIcon = Picture1.Picture.Handle'把图片框的图片句柄赋给TheData.HIcon
Shell_NotifyIcon NIM_MODIFY, TheData
动态显示托盘图标:
添加定时器,每到定时值触发一次事件更换图标;重新设置Thedata.HIcon为新的图标然后使用 Shell_NotifyIcon NIM_MODIFY, TheData 修改图标显示。
***************************************模块代码***********************************************
Option Explicit
Public OldWindowProc As Long
Public TheForm As Form
Public TheMenu As Menu
Public Const WM_USER = &H400
Public Const WM_LBUTTONUP = &H202 '左键消息编号
Public Const WM_MBUTTONUP = &H208 '中键消息编号
Public Const WM_RBUTTONUP = &H205 '右键消息编号
Public Const TRAY_CALLBACK = (WM_USER + 1001&) '消息编号
Public Const GWL_WNDPROC = (-4)
Public Const NIF_ICON = &H2 '
Public Const NIF_TIP = &H4
Public Const NIF_MESSAGE = &H1
Public Const NIM_ADD = &H0
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2
Public Type NOTIFYICONDATA '定义结构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
Public TheData As NOTIFYICONDATA '定义结构对象TheData
Public 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
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) 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
RemoveTray
TheForm.WindowState = vbNormal
TheForm.Show
TheForm.SetFocus
Exit Function
End If
End If
If lParam = WM_RBUTTONUP Then
SetForegroundWindow TheForm.hwnd '按下右键时使窗体获得焦点,这也可以使用TheForm.SetFocus代替以实现右键菜单弹出后不能消失的问题
TheForm.PopupMenu TheMenu '弹出菜单
Exit Function
End If
End If
NewWindowProc = CallWindowProc(OldWindowProc, hwnd, Msg, wParam, lParam) '把原来消息函数的消息传递给自定义的消息函数
End Function
Public Sub SetTray() '调用此子过程添加托盘图标
OldWindowProc = SetWindowLong(TheForm.hwnd, GWL_WNDPROC, AddressOf NewWindowProc) '设置新的自定义消息循环函数以进行左、右键按键处理
'存储原来消息函数地址到OldWindowProc
With TheData
.Uid = 0
.hwnd = TheForm.hwnd
.cbSize = Len(TheData)
.HIcon = TheForm.Icon.Handle
.UFlags = NIF_ICON
.UCallbackMessage = TRAY_CALLBACK
.UFlags = .UFlags Or NIF_MESSAGE Or NIF_TIP
.SzTip = "右键退出菜单" & vbNullChar
.cbSize = Len(TheData)
End With
Shell_NotifyIcon NIM_ADD, TheData '显示托盘图标
End Sub
Public Sub Minimized() '调用此子过程最小化隐藏窗体
If TheForm.WindowState = vbMinimized Then TheForm.Hide
End Sub
Public Sub RemoveTray() '调用此子过程删除托盘图标
With TheData
.UFlags = 0
End With
Shell_NotifyIcon NIM_DELETE, TheData '删除托盘图标
SetWindowLong TheForm.hwnd, GWL_WNDPROC, OldWindowProc '恢复消息循环函数为原有的
End Sub
*************************************代码结束*************************************************
'模块说明:模块包括建立托盘图标,删除托盘图标,最小化隐藏窗体,自定义消息循环函数
'Settray子过程:功能为建立托盘图标,即调用此过程会设置自定义消息循环函数并建立托盘图标以及右键弹出菜单
'Minimized子过程:功能为最小化时隐藏TheForm窗体
'RemoveTray子过程:功能为删除托盘图标并恢复消息循环函数为原来函数
'在窗体上应该使用菜单编辑器编辑一个菜单mnuTray并建立其子菜单mnuTrayexit (退出),在mnuTrayexit (退出)的click事件里应该调用RemoveTray子过程并unload me;
'TheForm 在开始时(Formload过程)应该指定为窗体Me;TheMenu在开始时(Formload过程)应该指定为菜单名称mnuTray;
'为实现最小化时托盘显示应该在Form_Resize过程中隐藏窗体并调用Settray子过程以及Minimized子过程以建立托盘图标并隐藏窗体
'以下为基本的建立托盘图标的过程代码
*************************************窗体代码内容*********************************************
Private Sub Form_Load()
Set TheForm = Me '窗体
Set TheMenu = mnuTray '菜单名称,一定要建立菜单且名称必须与代码的一致
'代码中的菜单名称为mnuTray,标题自定义,mnuTray的子菜单为弹出来的菜单例中只建立了一个子菜单mnuTrayexit
End Sub
Private Sub Form_Resize()
If TheForm.WindowState = vbMinimized Then
SetTray '调用过程显示托盘图标
Minimized '调用过程最小化隐藏窗体,效果为最小化到托盘
End If
End Sub
Private Sub mnuTrayexit_Click()
RemoveTray '调用过程删除托盘图标
Unload TheForm '卸载窗体
End Sub
*************************************代码结束*************************************************
追问
可用,谢谢。只是有个问题:360在网购保镖模式下认为是可疑程序。
参考资料: http://blog.sina.com.cn/s/blog_518318f50100gnlp.html
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询