一定要这样
0)最小化时,先最小化,然后hide
1)托盘区鼠标按下,setforegroundwindow
2)当恢复时,先show,然后restore,再setforegroundwindow。

解决方案 »

  1.   


    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
      

  2.   

    你要做的是抢回应用程序焦点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
    夜已深,还有什么人,像我这样,醒着在编程
    -------------------------------
    海纳百川,有容乃大;
    壁立千仞,无欲则刚。
      

  3.   

    不知道你看过.net中的VB帮助没有,里面有的例子,是专门用来做托盘的,十分典型,急具参考价值:
    Microsoft Visual Studio .NET 文档
    ms-help://MS.VSCC/MS.MSDNVS.2052/vbref/html/vbsamwindowsformssystemtraysample.htm