我们要自己写程序来处理消息,必须先更改窗口的属性,从原来由默认的窗口过程来处理消息变成由我们自己写的消息处理过程来处理消息。方法是使用SetWindowLong函数来取得默认窗口过程的地址,然后转向为我们自己写的窗口过程的地址,具体的实现方法如下代码:
'GWL_WNDPROC获得该窗口的窗口过程的地址,AddressOf是取址函数,NewWindowProc是我们写的过程 OldWindowProc = SetWindowLong(frm.HWnd, GWL_WNDPROC, AddressOf NewWindowProc) |
然后在NewWindowProc函数中写入如下代码,需要注意的是下面代码中红色的TRAY_CALLBACK是由托盘区图标传来的消息,要让托盘图标传回消息,必须在添加托盘图标时指定:
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 |
最后要提醒你,在程序退出时一定要把窗口过程的地址恢复为默认值,同时把托盘图标移去哦。
VB托盘程序详解(1)[转载]VB托盘程序详解(2)[转载]VB托盘程序详解(3)[转载]VB托盘程序详解(4)[转载]VB托盘程序详解(5)[转载]