我們要自己寫程序來處理消息,必須先更改窗口的屬性,從原來由默認的窗口過程來處理消息變成由我們自己寫的消息處理過程來處理消息。方法是使用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)[轉載]