Private Sub Form_Resize() If Me.WindowState = 1 Then Call Shell_NotifyIcon(NIM_ADD, IconData) Me.Hide End If End Sub Private Sub Form_Load() With IconData .cbSize = Len(IconData) .hIcon = Me.Icon .hWnd = Me.hWnd .szTip = "My Tooltip" & Chr(0) .uCallbackMessage = WM_MOUSEMOVE .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE .uID = vbNull End With End Sub Private Sub mnuExit_Click() Unload Me End End Sub Private Sub mnuShow_Click() Me.WindowState = vbNormal Shell_NotifyIcon NIM_DELETE, IconData Me.Show End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Dim Msg As Long Msg = X If Msg = WM_LBUTTONDBLCLK Then Call mnuShow_Click ElseIf Msg = WM_RBUTTONDOWN Then PopupMenu mnuPopup End If End Sub Private Sub Form_Unload(Cancel As Integer) Shell_NotifyIcon NIM_DELETE, IconData End Sub
你要做的是抢回应用程序焦点Private Declare Function SetForegroundWindow Lib "User32" (ByVal hWnd As Long) As Long 用这个函数,不过,要说明一点,它并不能真的帮你夺回焦点!用这个办法则可以!'In a module Option Explicit Private Declare Function GetWindowThreadProcessId Lib "User32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long Private Declare Function AttachThreadInput Lib "User32" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long Private Declare Function GetForegroundWindow Lib "User32" () As Long Private Declare Function SetForegroundWindow Lib "User32" (ByVal hWnd As Long) As Long Private Declare Function IsIconic Lib "User32" (ByVal hWnd As Long) As Long Private Declare Function ShowWindow Lib "User32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As LongPrivate Const SW_SHOW = 5 Private Const SW_RESTORE = 9 Public Function ForceForegroundWindow(ByVal hWnd As Long) As Boolean Dim ThreadID1 As Long Dim ThreadID2 As Long Dim nRet As Long If hWnd = GetForegroundWindow() Then ForceForegroundWindow = True Else ThreadID1 = GetWindowThreadProcessId(GetForegroundWindow, ByVal 0&) ThreadID2 = GetWindowThreadProcessId(hWnd, ByVal 0&) If ThreadID1 <> ThreadID2 Then Call AttachThreadInput(ThreadID1, ThreadID2, True) nRet = SetForegroundWindow(hWnd) Call AttachThreadInput(ThreadID1, ThreadID2, False) Else nRet = SetForegroundWindow(hWnd) End If If IsIconic(hWnd) Then Call ShowWindow(hWnd, SW_RESTORE) Else Call ShowWindow(hWnd, SW_SHOW) End If ForceForegroundWindow = CBool(nRet) End If End Function 夜已深,还有什么人,像我这样,醒着在编程 ------------------------------- 海纳百川,有容乃大; 壁立千仞,无欲则刚。
不知道你看过.net中的VB帮助没有,里面有的例子,是专门用来做托盘的,十分典型,急具参考价值: Microsoft Visual Studio .NET 文档 ms-help://MS.VSCC/MS.MSDNVS.2052/vbref/html/vbsamwindowsformssystemtraysample.htm
Private Sub Form_Resize()
If Me.WindowState = 1 Then
Call Shell_NotifyIcon(NIM_ADD, IconData)
Me.Hide
End If
End Sub
Private Sub Form_Load()
With IconData
.cbSize = Len(IconData)
.hIcon = Me.Icon
.hWnd = Me.hWnd
.szTip = "My Tooltip" & Chr(0)
.uCallbackMessage = WM_MOUSEMOVE
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
.uID = vbNull
End With
End Sub
Private Sub mnuExit_Click()
Unload Me
End
End Sub
Private Sub mnuShow_Click()
Me.WindowState = vbNormal
Shell_NotifyIcon NIM_DELETE, IconData
Me.Show
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim Msg As Long
Msg = X
If Msg = WM_LBUTTONDBLCLK Then
Call mnuShow_Click
ElseIf Msg = WM_RBUTTONDOWN Then
PopupMenu mnuPopup
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
Shell_NotifyIcon NIM_DELETE, IconData
End Sub
用这个函数,不过,要说明一点,它并不能真的帮你夺回焦点!用这个办法则可以!'In a module
Option Explicit
Private Declare Function GetWindowThreadProcessId Lib "User32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function AttachThreadInput Lib "User32" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long
Private Declare Function GetForegroundWindow Lib "User32" () As Long
Private Declare Function SetForegroundWindow Lib "User32" (ByVal hWnd As Long) As Long
Private Declare Function IsIconic Lib "User32" (ByVal hWnd As Long) As Long
Private Declare Function ShowWindow Lib "User32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As LongPrivate Const SW_SHOW = 5
Private Const SW_RESTORE = 9
Public Function ForceForegroundWindow(ByVal hWnd As Long) As Boolean
Dim ThreadID1 As Long
Dim ThreadID2 As Long
Dim nRet As Long If hWnd = GetForegroundWindow() Then
ForceForegroundWindow = True
Else
ThreadID1 = GetWindowThreadProcessId(GetForegroundWindow, ByVal 0&)
ThreadID2 = GetWindowThreadProcessId(hWnd, ByVal 0&)
If ThreadID1 <> ThreadID2 Then
Call AttachThreadInput(ThreadID1, ThreadID2, True)
nRet = SetForegroundWindow(hWnd)
Call AttachThreadInput(ThreadID1, ThreadID2, False)
Else
nRet = SetForegroundWindow(hWnd)
End If
If IsIconic(hWnd) Then
Call ShowWindow(hWnd, SW_RESTORE)
Else
Call ShowWindow(hWnd, SW_SHOW)
End If
ForceForegroundWindow = CBool(nRet)
End If
End Function
夜已深,还有什么人,像我这样,醒着在编程
-------------------------------
海纳百川,有容乃大;
壁立千仞,无欲则刚。
Microsoft Visual Studio .NET 文档
ms-help://MS.VSCC/MS.MSDNVS.2052/vbref/html/vbsamwindowsformssystemtraysample.htm