这是一段托盘程序
其中有个地方没看懂就是addtoTray过程中NewWindowProc与OldWindowProc中怎么传递消息的,为什么要这么传递
Public OldWindowProc As Long
Public TheForm As Form
Public TheMenu As Menu'*******************************************************************
' 目的: 自定义的消息处理过程
' 输入: hWnd:接受消息的窗口句柄
' Msg:消息内容
' wParam:消息参数
' lParam:消息参数
' 返回: 消息处理结果
'*******************************************************************
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
' The user clicked on the tray icon.
' Look for click events.
If lParam = WM_LBUTTONUP Then
' On left click, show the form.
If TheForm.WindowState = vbMinimized Then
TheForm.WindowState = TheForm.LastState
End If
TheForm.SetFocus
Exit Function
End If
If lParam = WM_RBUTTONUP Then
' On right click, show the menu.
TheForm.PopupMenu TheMenu
Exit Function
End If
End If
' 发送其他消息给原有的消息处理过程
NewWindowProc = CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam)
End Function'*******************************************************************
' 目的: 为任务栏添加一个新的图标
' 输入: frm:接受任务栏消息的窗体
' mnu:右键单击任务栏图标时显示的菜单
' 返回: 无
'*******************************************************************
Public Sub AddToTray(frm As Form, mnu As Menu)
' frm窗体的ShowInTaskbar属性必须在设计期间设置为False,
' 这个属性在程序运行期间是只读的 Set TheForm = frm
Set TheMenu = mnu
' 为窗体设置新的消息处理函数
OldWindowProc = SetWindowLong(frm.hWnd, GWL_WNDPROC, AddressOf NewWindowProc)
' 设置任务栏图标的参数
With TheData
.uID = 0
.hWnd = frm.hWnd
.cbSize = Len(TheData)
.hIcon = frm.Icon.Handle
.uFlags = NIF_ICON
.uCallbackMessage = TRAY_CALLBACK
.uFlags = .uFlags Or NIF_MESSAGE
.cbSize = Len(TheData)
End With
'添加任务栏图标
Shell_NotifyIcon NIM_ADD, TheData
End Sub
其中有个地方没看懂就是addtoTray过程中NewWindowProc与OldWindowProc中怎么传递消息的,为什么要这么传递
Public OldWindowProc As Long
Public TheForm As Form
Public TheMenu As Menu'*******************************************************************
' 目的: 自定义的消息处理过程
' 输入: hWnd:接受消息的窗口句柄
' Msg:消息内容
' wParam:消息参数
' lParam:消息参数
' 返回: 消息处理结果
'*******************************************************************
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
' The user clicked on the tray icon.
' Look for click events.
If lParam = WM_LBUTTONUP Then
' On left click, show the form.
If TheForm.WindowState = vbMinimized Then
TheForm.WindowState = TheForm.LastState
End If
TheForm.SetFocus
Exit Function
End If
If lParam = WM_RBUTTONUP Then
' On right click, show the menu.
TheForm.PopupMenu TheMenu
Exit Function
End If
End If
' 发送其他消息给原有的消息处理过程
NewWindowProc = CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam)
End Function'*******************************************************************
' 目的: 为任务栏添加一个新的图标
' 输入: frm:接受任务栏消息的窗体
' mnu:右键单击任务栏图标时显示的菜单
' 返回: 无
'*******************************************************************
Public Sub AddToTray(frm As Form, mnu As Menu)
' frm窗体的ShowInTaskbar属性必须在设计期间设置为False,
' 这个属性在程序运行期间是只读的 Set TheForm = frm
Set TheMenu = mnu
' 为窗体设置新的消息处理函数
OldWindowProc = SetWindowLong(frm.hWnd, GWL_WNDPROC, AddressOf NewWindowProc)
' 设置任务栏图标的参数
With TheData
.uID = 0
.hWnd = frm.hWnd
.cbSize = Len(TheData)
.hIcon = frm.Icon.Handle
.uFlags = NIF_ICON
.uCallbackMessage = TRAY_CALLBACK
.uFlags = .uFlags Or NIF_MESSAGE
.cbSize = Len(TheData)
End With
'添加任务栏图标
Shell_NotifyIcon NIM_ADD, TheData
End Sub
解决方案 »
- VB 打包后文件引用问题,具体问题如下
- 为什么用winsock控件连续发数据发到1000多次时就会变慢?
- 求救:在某些机器上,调用data report报表时候出现 “无效数据源”错误
- 请问VB数据库时间格式输出到excel文件怎么写?--急,在线等
- 求 vb 主成分分析 源代码
- 商业控件注册功能是如何实现的?
- 菜鸟问题,我在窗体设了picture属性。怎样让图版充满整个窗口啊!
- vb不认 Trim("aa")这样的语句咋回事?
- 如何在打开文件的同时定位到文件的特定位置?
- 关于vb组合框(combobox)控件显示和光标定位问题,急!在线等...
- 写注册表操作的VB代码有问题
- 100分求救。。。。VISTA 下如何删除文件
NewWindowProc:拦截某个(些)特定消息,然后用你的消息去代替
OldWindowProc:就是不用自己去处理,让系统自己处理。
NewWindowProc = CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam)
这个方法将其它没有处理的消息传递给原来的消息处理过程来处理。
google 或 百度 “VB子类化”