注意事項(xiàng):一定記得建立菜單并且名稱(chēng)必須和代碼中的一致或者修改代碼中的名稱(chēng)否則會(huì)有錯(cuò)誤提示,在代碼最后有一段代碼,把這段代碼復(fù)制到窗體代碼里面取消注釋即可
建立步驟:
1.新建一個(gè)工程,設(shè)置窗體的屬性
BoarderStyle為1-Fixed single
MinButton為true
ShowIntaskbar為false
把下文的窗體代碼內(nèi)容復(fù)制到工程的窗體代碼框;
2.工程添加一個(gè)模塊并把文中的模塊代碼復(fù)制到模塊代碼里;
3.右鍵點(diǎn)擊窗體選擇菜單
編輯器,在名稱(chēng)中輸入mnuTray,標(biāo)題為“右鍵菜單”,可見(jiàn)
復(fù)選框設(shè)為非選擇狀態(tài);點(diǎn)擊下一個(gè),點(diǎn)擊右
箭頭,在名稱(chēng)里輸入mnuTrayexit,標(biāo)題為“退出”;最后點(diǎn)擊確定。
4.點(diǎn)擊工具欄中的啟動(dòng)按鈕,運(yùn)行程序;
5.點(diǎn)擊最小化鍵,在托盤(pán)顯示出圖標(biāo)并隱藏了窗口即:最小化到系統(tǒng)狀態(tài)欄。右鍵點(diǎn)擊一下托盤(pán)圖標(biāo),彈出菜單。左鍵點(diǎn)擊托盤(pán)圖標(biāo)窗口還原。
更改托盤(pán)圖標(biāo):
方法一:設(shè)置工程窗體的圖標(biāo),即在窗體的屬性中的Icon中選擇自定義的*.ico文件。代碼中使用的是窗體的圖標(biāo);
方法二:使用一個(gè)圖片框存儲(chǔ)圖標(biāo),并把圖片框的
句柄賦給Thedata中的HIcon即可,在with....end with中修改或直接Thedata.HIcon=...即可。
TheData.HIcon = Picture1.Picture.Handle'把圖片框的圖片句柄賦給TheData.HIcon
Shell_NotifyIcon NIM_MODIFY, TheData
動(dòng)態(tài)顯示托盤(pán)圖標(biāo):
添加
定時(shí)器,每到定時(shí)值觸發(fā)一次事件更換圖標(biāo);重新設(shè)置Thedata.HIcon為新的圖標(biāo)然后使用 Shell_NotifyIcon NIM_MODIFY, TheData 修改圖標(biāo)顯示。
***************************************模塊代碼***********************************************
Option Explicit
Public OldWindowProc As Long
Public TheForm As Form
Public TheMenu As Menu
Public Const WM_USER = &H400
Public Const WM_LBUTTONUP = &H202 '左鍵消息編號(hào)
Public Const WM_MBUTTONUP = &H208 '中鍵消息編號(hào)
Public Const WM_RBUTTONUP = &H205 '右鍵消息編號(hào)
Public Const TRAY_CALLBACK = (WM_USER + 1001&) '消息編號(hào)
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 '定義結(jié)構(gòu)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 '定義結(jié)構(gòu)對(duì)象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
'自己建立的消息循環(huán)處理過(guò)程
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 '按下右鍵時(shí)使窗體獲得焦點(diǎn),這也可以使用TheForm.SetFocus代替以實(shí)現(xiàn)右鍵菜單彈出后不能消失的問(wèn)題
TheForm.PopupMenu TheMenu '彈出菜單
Exit Function
End If
End If
NewWindowProc = CallWindowProc(OldWindowProc, hwnd, Msg, wParam, lParam) '把原來(lái)消息
函數(shù)的消息傳遞給自定義的消息函數(shù)
End Function
Public Sub SetTray() '調(diào)用此子過(guò)程添加托盤(pán)圖標(biāo)
OldWindowProc = SetWindowLong(TheForm.hwnd, GWL_WNDPROC, AddressOf NewWindowProc) '設(shè)置新的自定義消息循環(huán)函數(shù)以進(jìn)行左、右鍵按鍵處理
'存儲(chǔ)原來(lái)消息函數(shù)地址到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 '顯示托盤(pán)圖標(biāo)
End Sub
Public Sub Minimized() '調(diào)用此子過(guò)程最小化隱藏窗體
If TheForm.WindowState = vbMinimized Then TheForm.Hide
End Sub
Public Sub RemoveTray() '調(diào)用此子過(guò)程刪除托盤(pán)圖標(biāo)
With TheData
.UFlags = 0
End With
Shell_NotifyIcon NIM_DELETE, TheData '刪除托盤(pán)圖標(biāo)
SetWindowLong TheForm.hwnd, GWL_WNDPROC, OldWindowProc '恢復(fù)消息循環(huán)函數(shù)為原有的
End Sub
*************************************代碼結(jié)束*************************************************
'模塊說(shuō)明:模塊包括建立托盤(pán)圖標(biāo),刪除托盤(pán)圖標(biāo),最小化隱藏窗體,自定義消息循環(huán)函數(shù)
'Settray子過(guò)程:功能為建立托盤(pán)圖標(biāo),即調(diào)用此過(guò)程會(huì)設(shè)置自定義消息循環(huán)函數(shù)并建立托盤(pán)圖標(biāo)以及右鍵彈出菜單
'Minimized子過(guò)程:功能為最小化時(shí)隱藏TheForm窗體
'RemoveTray子過(guò)程:功能為刪除托盤(pán)圖標(biāo)并恢復(fù)消息循環(huán)函數(shù)為原來(lái)函數(shù)
'在窗體上應(yīng)該使用菜單編輯器編輯一個(gè)菜單mnuTray并建立其子菜單mnuTrayexit (退出),在mnuTrayexit (退出)的
click事件里應(yīng)該調(diào)用RemoveTray子過(guò)程并unload me;
'TheForm 在開(kāi)始時(shí)(Formload過(guò)程)應(yīng)該指定為窗體Me;TheMenu在開(kāi)始時(shí)(Formload過(guò)程)應(yīng)該指定為菜單名稱(chēng)mnuTray;
'為實(shí)現(xiàn)最小化時(shí)托盤(pán)顯示應(yīng)該在Form_Resize過(guò)程中隱藏窗體并調(diào)用Settray子過(guò)程以及Minimized子過(guò)程以建立托盤(pán)圖標(biāo)并隱藏窗體
'以下為基本的建立托盤(pán)圖標(biāo)的過(guò)程代碼
*************************************窗體代碼內(nèi)容*********************************************
Private Sub Form_Load()
Set TheForm = Me '窗體
Set TheMenu = mnuTray '菜單名稱(chēng),一定要建立菜單且名稱(chēng)必須與代碼的一致
'代碼中的菜單名稱(chēng)為mnuTray,標(biāo)題自定義,mnuTray的子菜單為彈出來(lái)的菜單例中只建立了一個(gè)子菜單mnuTrayexit
End Sub
Private Sub Form_Resize()
If TheForm.WindowState = vbMinimized Then
SetTray '調(diào)用過(guò)程顯示托盤(pán)圖標(biāo)
Minimized '調(diào)用過(guò)程最小化隱藏窗體,效果為最小化到托盤(pán)
End If
End Sub
Private Sub mnuTrayexit_Click()
RemoveTray '調(diào)用過(guò)程刪除托盤(pán)圖標(biāo)
Unload TheForm '卸載窗體
End Sub
*************************************代碼結(jié)束*************************************************