之前我给我的窗体加好了托盘代码,打开窗口后就会有一个托盘图标。现在我想实现点击最小化或关闭按钮都能最小到托盘,所以我就加了两段代码,看似实现了这种要求,但一到托盘就会消失了,请教是怎么回事,该怎么解决呐,谢谢代码如下:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) ‘关闭
If UnloadMode = 0 Then
Cancel = True
Me.Hide
If WindowState = vbMinimized Then
LastState = vbNormal
Else
LastState = WindowState
End If AddToTray Me, mnuTray
End If
End Sub
Private Sub Form_Resize() 、最小化
If Me.WindowState = 1 Then
Me.Hide
If WindowState = vbMinimized Then
LastState = vbNormal
Else
LastState = WindowState
End If
AddToTray Me, mnuTray
End If
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) ‘关闭
If UnloadMode = 0 Then
Cancel = True
Me.Hide
If WindowState = vbMinimized Then
LastState = vbNormal
Else
LastState = WindowState
End If AddToTray Me, mnuTray
End If
End Sub
Private Sub Form_Resize() 、最小化
If Me.WindowState = 1 Then
Me.Hide
If WindowState = vbMinimized Then
LastState = vbNormal
Else
LastState = WindowState
End If
AddToTray Me, mnuTray
End If
End Sub
Private Sub Form_Load()
ni.hwnd = Me.hwnd
ni.Icon = Me.Icon
ni.Tip = Me.Caption
End SubPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Me.WindowState = 0
Me.Show
ni.Delete
End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If UnloadMode = 0 Then
Cancel = 1
Me.WindowState = 1
End If
End SubPrivate Sub Form_Resize()
If Me.WindowState = 1 Then
Me.Hide
ni.Add
End If
End Sub
'类
Private Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uId As Long
uFlags As Long
uCallBackMessage As Long
hIcon As Long
szTip As String * 128
dwState As Long
dwStateMask As Long
szInfo As String * 256
uTimeoutOrVersion As Long '由于VB中没有Union类型,只能用Long型代替
szInfoTitle As String * 64
dwInfoFlags As Long
End TypePrivate Const NOTIFYICON_VERSION = 3
Private Const NOTIFYICON_OLDVERSION = 0Private Const NIF_MESSAGE = &H1
Private Const NIF_ICON = &H2
Private Const NIF_TIP = &H4
Private Const NIF_STATE = &H8
Private Const NIF_INFO = &H10
Private Const NIS_HIDDEN = &H1
Private Const NIS_SHAREDICON = &H2Private Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As BooleanEnum MouseAction
WM_MOUSEMOVE = &H200
WM_RBUTTONDOWN = &H204
End EnumEnum NIMAction
[NIM_ADD] = 0 '添加
[NIM_MODIFY] = 1 '修改
[NIM_DELETE] = 2 '删除
[NIM_SETFOCUS] = 3 '得焦点
[NIM_SETVERSION] = 4
End EnumEnum NIIFIcon
NIIF_NONE = &H0 '无图标
NIIF_WARNING = &H2 '警告
NIIF_ERROR = &H3 '错误
NIIF_INFO = &H1 '信息
End EnumPrivate ni As NOTIFYICONDATAPublic Property Let Balloon(ByVal vData As Boolean)
'设置是否有 Balloon Tooltip
On Error Resume Next If vData Then
ni.uFlags = NIF_INFO Or NIF_ICON Or NIF_TIP Or NIF_MESSAGE
Else
ni.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
End If
End Property
Public Property Let BalloonIcon(ByVal vData As NIIFIcon)
'设置Balloon Tooltip的图标
On Error Resume Next
ni.dwInfoFlags = vDataEnd Property
Public Property Let BalloonInfo(ByVal vData As String)
'设置Balloon Tooltip的内容
On Error Resume Next
ni.szInfo = vData & vbNullCharEnd PropertyPublic Property Let BalloonInfoTitle(ByVal vData As String)
'设置Balloon Tooltip的标题
On Error Resume Next ni.szInfoTitle = vData & vbNullCharEnd PropertyPublic Property Let Tip(ByVal vData As String)
'设置鼠标在图标上移动时的提示内容
On Error Resume Next ni.szTip = vData & Chr(0) NotifyIcon NIM_MODIFYEnd PropertyPublic Property Let Icon(ByVal vData As Long)
'设置压入托盘的图标
On Error Resume Next ni.hIcon = vData
End PropertyPublic Property Let hwnd(ByVal vData As Long)
'设置hwnd(窗体或图片框的hwnd)
On Error Resume Next
ni.hwnd = vData
End PropertyPublic Property Let MouseMsg(ByVal vNewValue As MouseAction)
ni.uCallBackMessage = vNewValue
End PropertyPublic Property Let Timeout(ByVal vNewValue As Long)
ni.uTimeoutOrVersion = vNewValue * 1000
End PropertySub Add()
NotifyIcon NIM_ADD
End SubSub Modify()
NotifyIcon NIM_MODIFY
End SubSub Delete()
NotifyIcon NIM_DELETE
End Sub
Private Sub NotifyIcon(ByVal action As NIMAction)
On Error Resume Next
Shell_NotifyIcon action, ni
End Sub
Private Sub Class_Initialize()
On Error Resume Next
With ni
.cbSize = Len(ni)
.uId = 1&
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
.uCallBackMessage = WM_MOUSEMOVE
.dwState = 1
.dwStateMask = 0
.uTimeoutOrVersion = 10000
.dwInfoFlags = 1
End With
End SubPrivate Sub Class_Terminate()
On Error Resume Next
Me.Delete
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If UnloadMode = 0 Then
RemoveFromTray ’我想先删除图标
Cancel = True
Me.Hide
If WindowState = vbMinimized Then
LastState = vbNormal
Else
LastState = WindowState
End If AddToTray Me, mnuTray
End If
End Sub
Private Sub Form_Resize()
If Me.WindowState = 1 Then
RemoveFromTray ’我想先删除图标
Me.Hide
If WindowState = vbMinimized Then
LastState = vbNormal
Else
LastState = WindowState
End If
AddToTray Me, mnuTray
End If
End Sub
If UnloadMode = 0 Then
Call ShowWindow(Me.hwnd, SW_HIDE)
Cancel = 1
Else
Cancel = 0
End If
End Sub
还有,能不用API的尽量不要用,占用系统内存~~~
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If UnloadMode = 0 Then
Call ShowWindow(Me.hwnd, SW_HIDE)
Cancel = 1
Else
Cancel = 0
End If
End Sub
.uCallBackMessage = WM_MOUSEMOVE
使用WM_MOUSEMOVE来传递ICON的消息,我怀疑是这个原因而产生的消息处理与原有的WM_MOUSEMOVE消息在参数中某些地方不区配而产生的错误,所以我建议你采用自定义消息来传递ICON消息,你可以试一下。
需要用到的API:
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 LongPublic Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex 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显示ICON前:
PreWndProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf wndProc取消:
SetWindowLong Me.hwnd, GWL_WNDPROC, PreWndProc 消息截获(需要在MODULE中)
Function wndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_USER + 100 Then
If lParam = WM_LBUTTONDOWN Then
'TODO: .......
End If
End If
wndProc = CallWindowProc(PreWndProc, hwnd, Msg, wParam, lParam)
End Function