还是给你一段代码吧:Public OldWindowProc As Long Public TheForm As Form Public TheMenu As Menu 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 Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 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 Const WM_USER = &H400 Public Const WM_LBUTTONUP = &H202 Public Const WM_MBUTTONUP = &H208 Public Const WM_RBUTTONUP = &H205 Public Const TRAY_CALLBACK = (WM_USER + 1001&) Public Const GWL_WNDPROC = (-4) Public Const GWL_USERDATA = (-21) Public Const NIF_ICON = &H2 Public Const NIF_TIP = &H4 Public Const NIM_ADD = &H0 Public Const NIF_MESSAGE = &H1 Public Const NIM_MODIFY = &H1 Public Const NIM_DELETE = &H2 Public 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 Type Private 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.Show TheForm.WindowState = 0 ’ TheForm.StartUpPosition = 2 End If ’单击的是右键,弹出快捷菜单 If lParam = WM_RBUTTONUP Then SetForegroundWindow TheForm.hwnd TheForm.PopupMenu TheMenu Exit Function End If End If ’将其他消息传递给原来的窗口程序 NewWindowProc = CallWindowProc(OldWindowProc, hwnd, Msg, wParam, lParam) End Function ’将程序图标添加到系统托盘区 Public 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 Sub ’将图标从系统托盘区中删除 Public Sub RemoveFromTray() With TheData .uFlags = 0 End With Shell_NotifyIcon NIM_DELETE, TheData ’ 恢复原来的窗口程序 . SetWindowLong TheForm.hwnd, GWL_WNDPROC, OldWindowProc End Sub ’设置图标的提示信息 Public Sub SetTrayTip(tip As String) With TheData .szTip = tip & vbNullChar .uFlags = NIF_TIP End With Shell_NotifyIcon NIM_MODIFY, TheData End Sub ’调用添加托盘图标子程序 AddToTray Me, mnuHide_ ’调用在托盘图标上显示提示的子程序 SetTrayTip "Document Manager" On Error Resume Next ’移除系统托盘 RemoveFromTray
'这是我的处理方法 ’思路:捕获鼠标单击,然后判断鼠标单击位置的窗体是什么,如果是该右键菜单,不作处理,如果不是,则判断有没有右键菜单出现(我限制了范围,在左下角,否则IE菜单弹不出了),有的话,则关闭。 Private Sub tmrSystem_Timer() ‘50ms Dim intKey As Integer Dim intMouse As Integer Dim strClassName As String * 255 Dim hwnd1 As Long Dim Mousemsg As POINTAPI
intKey = (GetAsyncKeyState(VK_F12) And &HFF00) / 2 ^ 15 intMouse = (GetAsyncKeyState(VK_LBUTTON) And &HFF00) / 2 ^ 15
If intKey = -1 Then 'F12 frmMain.WindowState = frmMain.LastState frmMain.Visible = True frmMain.SetFocus End If
If intMouse = -1 And frmMain.WindowState = 1 Then 'LBUTTON GetCursorPos Mousemsg Call GetClassName(WindowFromPoint(Mousemsg.X, Mousemsg.Y), strClassName, 255) If (InStr(strClassName, "#32768")) < 1 Then hwnd1 = FindWindow("#32768", "") Dim rt As RECT
If hwnd1 > 0 Then GetWindowRect hwnd1, rt If rt.Left > Screen.Width / Screen.TwipsPerPixelX - 300 And rt.Top > Screen.Height / Screen.TwipsPerPixelY - 150 Then SendMessage hwnd1, &H10, 0, 0 End If End If End If End If End Sub
用API在PopupMenu之前
加上 SetForegroundWindow 菜单所在窗口.hWnd
Public TheForm As Form
Public TheMenu As Menu
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
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
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 Const WM_USER = &H400
Public Const WM_LBUTTONUP = &H202
Public Const WM_MBUTTONUP = &H208
Public Const WM_RBUTTONUP = &H205
Public Const TRAY_CALLBACK = (WM_USER + 1001&)
Public Const GWL_WNDPROC = (-4)
Public Const GWL_USERDATA = (-21)
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4
Public Const NIM_ADD = &H0
Public Const NIF_MESSAGE = &H1
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2
Public 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 Type
Private 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.Show
TheForm.WindowState = 0
’ TheForm.StartUpPosition = 2
End If
’单击的是右键,弹出快捷菜单
If lParam = WM_RBUTTONUP Then
SetForegroundWindow TheForm.hwnd
TheForm.PopupMenu TheMenu
Exit Function
End If
End If
’将其他消息传递给原来的窗口程序
NewWindowProc = CallWindowProc(OldWindowProc, hwnd, Msg, wParam, lParam)
End Function
’将程序图标添加到系统托盘区
Public 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 Sub
’将图标从系统托盘区中删除
Public Sub RemoveFromTray()
With TheData
.uFlags = 0
End With
Shell_NotifyIcon NIM_DELETE, TheData
’ 恢复原来的窗口程序 .
SetWindowLong TheForm.hwnd, GWL_WNDPROC, OldWindowProc
End Sub
’设置图标的提示信息
Public Sub SetTrayTip(tip As String)
With TheData
.szTip = tip & vbNullChar
.uFlags = NIF_TIP
End With
Shell_NotifyIcon NIM_MODIFY, TheData
End Sub
’调用添加托盘图标子程序
AddToTray Me, mnuHide_
’调用在托盘图标上显示提示的子程序
SetTrayTip "Document Manager" On Error Resume Next
’移除系统托盘
RemoveFromTray
’思路:捕获鼠标单击,然后判断鼠标单击位置的窗体是什么,如果是该右键菜单,不作处理,如果不是,则判断有没有右键菜单出现(我限制了范围,在左下角,否则IE菜单弹不出了),有的话,则关闭。
Private Sub tmrSystem_Timer() ‘50ms
Dim intKey As Integer
Dim intMouse As Integer
Dim strClassName As String * 255
Dim hwnd1 As Long
Dim Mousemsg As POINTAPI
intKey = (GetAsyncKeyState(VK_F12) And &HFF00) / 2 ^ 15
intMouse = (GetAsyncKeyState(VK_LBUTTON) And &HFF00) / 2 ^ 15
If intKey = -1 Then 'F12
frmMain.WindowState = frmMain.LastState
frmMain.Visible = True
frmMain.SetFocus
End If
If intMouse = -1 And frmMain.WindowState = 1 Then 'LBUTTON
GetCursorPos Mousemsg
Call GetClassName(WindowFromPoint(Mousemsg.X, Mousemsg.Y), strClassName, 255)
If (InStr(strClassName, "#32768")) < 1 Then
hwnd1 = FindWindow("#32768", "")
Dim rt As RECT
If hwnd1 > 0 Then
GetWindowRect hwnd1, rt
If rt.Left > Screen.Width / Screen.TwipsPerPixelX - 300 And rt.Top > Screen.Height / Screen.TwipsPerPixelY - 150 Then
SendMessage hwnd1, &H10, 0, 0
End If
End If
End If
End If
End Sub