Option Explicit
Private Declare Function sendmessage Lib "user32" Alias "sendmessageA" (ByVal hwnd As Long, ByVal wmsg As Long, ByVal wparam As Long, iparam As Any) As LongPrivate Const wm_syscommand = &H112
Private Const sc_move = &HF010&
Private Const sc_restore = &HF120&
Private Const sc_size = &HF000&Private Sub form_load()
If WindowState = vbMinimized Then
LastState = vbNormal
Else
LastState = WindowState
End If
addtotray Me, mnutray
End SubPrivate Sub form_resizie()
Select Case WindowState
Case vbmininized
mnutraymaximize.Enabled = True
mnutrayminimize.Enabled = False
mnutrayrestore.Enabled = True
mnutraysize.Enabled = False
mnutraymove.Enabled = FalseCase vbMaximized
mnutraymaximize.Enabled = False
mnutrayminimize.Enabled = True
mnutrayrestore.Enabled = True
mnutraysize.Enabled = False
mnutraymove.Enabled = FalseCase vbNormal
mnutraymaximize.Enabled = True
mnutrayminimize.Enabled = True
mnutrayrestore.Enabled = False
mnutraysize.Enabled = True
mnutraymove.Enabled = True
End Select
If WindowState <> vbMinimized Then LastState = WindowState
End SubPrivate Sub form_unload(cancel As Integer)
removefromtray
End SubPrivate Sub mnufileexit_click()
Unload Me
End SubPrivate Sub mnutrayclose_click()
Unload Me
End SubPrivate Sub mnutraymaximize_click()
WindowState = vbMaximized
End SubPrivate Sub mnutrayminimize_click()
WindowState = vbMinimized
End SubPrivate Sub mnutraymove_click()
sendmessage hwnd, wm_syscommadn, sc_move, 0&
End SubPrivate Sub mnutrayrestore_cilck()
sendmessage hwnd, wm_syscommand, sc_restore, 0&
End SubPrivate Sub mnutraysize_click()
sendmessage hwnd, wm_syscommand, sc_size, 0&
End Sub我按f5,它提示说
Private Sub form_load()
If WindowState = vbMinimized Then
LastState = vbNormal
Else
LastState = WindowState
End If
addtotray Me, mnutray
End Sub变量未定义,求解
Private Declare Function sendmessage Lib "user32" Alias "sendmessageA" (ByVal hwnd As Long, ByVal wmsg As Long, ByVal wparam As Long, iparam As Any) As LongPrivate Const wm_syscommand = &H112
Private Const sc_move = &HF010&
Private Const sc_restore = &HF120&
Private Const sc_size = &HF000&Private Sub form_load()
If WindowState = vbMinimized Then
LastState = vbNormal
Else
LastState = WindowState
End If
addtotray Me, mnutray
End SubPrivate Sub form_resizie()
Select Case WindowState
Case vbmininized
mnutraymaximize.Enabled = True
mnutrayminimize.Enabled = False
mnutrayrestore.Enabled = True
mnutraysize.Enabled = False
mnutraymove.Enabled = FalseCase vbMaximized
mnutraymaximize.Enabled = False
mnutrayminimize.Enabled = True
mnutrayrestore.Enabled = True
mnutraysize.Enabled = False
mnutraymove.Enabled = FalseCase vbNormal
mnutraymaximize.Enabled = True
mnutrayminimize.Enabled = True
mnutrayrestore.Enabled = False
mnutraysize.Enabled = True
mnutraymove.Enabled = True
End Select
If WindowState <> vbMinimized Then LastState = WindowState
End SubPrivate Sub form_unload(cancel As Integer)
removefromtray
End SubPrivate Sub mnufileexit_click()
Unload Me
End SubPrivate Sub mnutrayclose_click()
Unload Me
End SubPrivate Sub mnutraymaximize_click()
WindowState = vbMaximized
End SubPrivate Sub mnutrayminimize_click()
WindowState = vbMinimized
End SubPrivate Sub mnutraymove_click()
sendmessage hwnd, wm_syscommadn, sc_move, 0&
End SubPrivate Sub mnutrayrestore_cilck()
sendmessage hwnd, wm_syscommand, sc_restore, 0&
End SubPrivate Sub mnutraysize_click()
sendmessage hwnd, wm_syscommand, sc_size, 0&
End Sub我按f5,它提示说
Private Sub form_load()
If WindowState = vbMinimized Then
LastState = vbNormal
Else
LastState = WindowState
End If
addtotray Me, mnutray
End Sub变量未定义,求解
Private Sub form_load()
dim LastState as long
If WindowState = vbMinimized Then
LastState = vbNormal
Else
LastState = WindowState
End If
addtotray Me, mnutray
End Sub
Private 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
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Private Const WM_USER = &H400
Private Const WM_LBUTTONUP = &H202
Private Const WM_MBUTTONUP = &H208
Private Const WM_RBUTTONUP = &H205
Private Const TRAY_CALLBACK = (WM_USER + 1001&)
Private Const GWL_WNDPROC = (-4)
Private Const GWL_USERDATA = (-21)
Private Const NIF_ICON = &H2
Private Const NIF_TIP = &H4
Private Const NIM_ADD = &H0
Private Const NIF_MESSAGE = &H1
Private Const NIM_MODIFY = &H1
Private Const NIM_DELETE = &H2
Public OldWindowProc As Long
Public TheForm As Form
Public TheMenu As MenuPrivate Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * 64
End TypePrivate TheData As NOTIFYICONDATA'新的窗口程序,它将取代原来的窗口程序
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 ' 单击左键,恢复窗体
TheForm.WindowState = 0
End If
If lParam = WM_RBUTTONUP Then '单击右键,弹出快捷菜单
TheForm.PopupMenu TheMenu
Exit Function
End If
End If
'将其他消息传递给原来的窗口程序
NewWindowProc = CallWindowProc(OldWindowProc, hwnd, Msg, wParam, lParam)
End FunctionPublic Sub AddToTray(frm As Form, mnu As Menu) '将程序图标添加到系统托盘区
'保存变量以供其他处引用
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 + NIF_TIP + NIF_MESSAGE
.uCallbackMessage = TRAY_CALLBACK
.uFlags = .uFlags Or NIF_MESSAGE
.cbSize = Len(TheData)
End With
Shell_NotifyIcon NIM_ADD, TheData
End SubPublic Sub RemoveFromTray() '将图标从系统托盘区中删除
TheData.uFlags = 0
Shell_NotifyIcon NIM_DELETE, TheData
SetWindowLong TheForm.hwnd, GWL_WNDPROC, OldWindowProc ' 恢复原来的窗口程序 .
End SubPublic Sub SetTrayTip(tip As String) '设置图标的提示信息
With TheData
.szTip = tip & vbNullChar
.uFlags = NIF_TIP
End With
Shell_NotifyIcon NIM_MODIFY, TheData
End SubPrivate Sub Form_Load()
AddToTray Me, mnuTray '调用添加托盘图标子程序
SetTrayTip "123" '调用在托盘图标上显示提示的子程序"
End SubPrivate Sub Form_Unload(Cancel As Integer)
On Error Resume Next
RemoveFromTray '在窗体退出后,删除托盘中的图标
End Sub
这是全部代码,还是显示未定义mnutray
比如 退出(结束程序)、显示窗口、最小化(隐藏)等等。
系统会先检查在运行。