我的源程序在下面
出现问题是:执行后,鼠标点在状态栏的哪个图标上,没反应,也就是form_mousemove事件根本就没反应,程序没有执行到那里去模块程序
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPublic Const WM_SYSCOMMAND = &H112
Public Const SC_RESTORE = &HF120&Public LastState As Integer '保留原窗口状态'---------- dwMessage可以是以下NIM_ADD、NIM_DELETE、NIM_MODIFY 标识符之一----------
Public Const NIM_ADD = &H0 '在任务栏中增加一个图标
Public Const NIM_DELETE = &H2 '删除任务栏中的一个图标
Public Const NIM_MODIFY = &H1 '修改任务栏中个图标信息Public Const NIF_MESSAGE = &H1 'NOTIFYICONDATA结构中uFlags的控制信息
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4Public Const WM_MOUSEMOVE = &H200 '当鼠标指针移至图标上Public Const WM_LBUTTONUP = &H202
Public Const WM_RBUTTONUP = &H205Public Type NOTIFYICONDATA
  cbSize As Long '该数据结构的大小
  hwnd As Long '处理任务栏中图标的窗口句柄
  uID As Long '定义的任务栏中图标的标识
  uFlags As Long '任务栏图标功能控制,可以是以下值的组合(一般全包括)
  'NIF_MESSAGE 表示发送控制消息;
  'NIF_ICON表示显示控制栏中的图标;
  'NIF_TIP表示任务栏中的图标有动态提示。
  uCallbackMessage As Long '任务栏图标通过它与用户程序交换消息,处理该消息的窗口由hWnd决定
  hIcon As Long '任务栏中的图标的控制句柄
  szTip As String * 64 '图标的提示信息
  szInfoTitle As String * 64
End Type
窗体程序Option ExplicitDim myData As NOTIFYICONDATAPrivate Sub Form_Load()
If WindowState = vbMinimized Then
        LastState = vbNormal
    Else
        LastState = WindowState
    End If  With myData
    .cbSize = Len(myData)
    .hwnd = Me.hwnd
    .uID = 0
    .uFlags = NIF_ICON Or NIF_MESSAGE Or NIF_TIP
    .uCallbackMessage = WM_MOUSEMOVE
    .hIcon = Me.Icon.Handle '默认为窗口图标
    .szTip = "提示" & vbNullChar
    .szTip = "lala" & Chr(13) & ":)" & vbNullChar
  End With
  Shell_NotifyIcon NIM_ADD, myData
End SubPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  Select Case CLng(X)
    Case WM_RBUTTONUP '鼠标在图标上右击时弹出菜单
        MsgBox "sfd"
    Case WM_LBUTTONUP '鼠标在图标上左击时窗口若最小化则恢复窗口位置
        If Me.WindowState = vbMinimized Then
            Me.Show
            Me.WindowState = LastState
            
            SendMessage hwnd, WM_SYSCOMMAND, SC_RESTORE, 0&
          '  Me.Show 1
        End If
  End Select
End Sub
Private Sub Form_Unload(Cancel As Integer)
    If MsgBox("你是否要退出局域网消息发送器 ?", 4 + 32 + 256, "局域网消息发送器") = vbYes Then
        Cancel = False
        Shell_NotifyIcon NIM_DELETE, myData '窗口卸载时,将状态栏中的图标一同卸载
        End
    Else
        Cancel = True
    End If
End Sub
Private Sub Form_Resize()
'    mnvComputer.Width = Me.Width - 150
'    If Me.Height - 850 > 0 Then
'       mnvComputer.Height = Me.Height - 850
'    End If
'    SSTab1.Width = Me.Width - 20
'    SSTab1.Height = Me.Height    Select Case WindowState
        Case vbMinimized
            Me.Hide
     '     mnuTrayMaximize.Enabled = True
         ' mnuTrayMinimize.Enabled = False
          'mnuTrayRestore.Enabled = True
        Case vbMaximized
         ' mnuTrayMinimize.Enabled = True
         ' mnuTrayRestore.Enabled = True
            'SSTab1.SetFocus
        Case vbNormal
    '      mnuTrayMaximize.Enabled = True
            'Me.Width = 1800
            'Me.Height = 6855
          'mnuTrayMinimize.Enabled = True
          'mnuTrayRestore.Enabled = False
          '  SSTab1.SetFocus
    End Select
    'mnuTrayMaximize.Enabled = False
    If WindowState <> vbMinimized Then LastState = WindowState
End Sub

解决方案 »

  1.   

    Select Case CLng(X)
        Case WM_RBUTTONUP '鼠标在图标上右击时弹出菜单
            MsgBox "sfd"
        Case WM_LBUTTONUP '鼠标在图标上左击时窗口若最小化则恢复窗口位置
            If Me.WindowState = vbMinimized Then
                Me.Show
                Me.WindowState = LastState
                
                SendMessage hwnd, WM_SYSCOMMAND, SC_RESTORE, 0&
              '  Me.Show 1
            End If
      End Select
    这里有错,API中的坐标单位是Pixels,VB默认的坐标单位是Twips
    改一下:
    Select Case CLng(X/ Screen.TwipsPerPixelX)
        Case WM_RBUTTONUP '鼠标在图标上右击时弹出菜单
            MsgBox "sfd"
        Case WM_LBUTTONUP '鼠标在图标上左击时窗口若最小化则恢复窗口位置
            If Me.WindowState = vbMinimized Then
                Me.Show
                Me.WindowState = LastState
                
                SendMessage hwnd, WM_SYSCOMMAND, SC_RESTORE, 0&
              '  Me.Show 1
            End If
      End Select
      

  2.   

    大侠是这样的,这个独立的这样改了可以,可当我写进我已经完成的一个软件里时,就发生:鼠标点在状态栏的哪个图标上,没反应,也就是form_mousemove事件根本就没进去,程序没有执行到那里去。
        我晕,居然有这种事情发生,代码是好的,独立出来都可以,可我的软件不可以
        大虾们帮帮阿(天火大虾非常感谢你)
      

  3.   

    你为什么要放到form_mousemove这个事件里呢?
      

  4.   

    鼠标移动到图标上,tip显示了吗?
      

  5.   

    to 天火大大:tip显示了阿to 周松大大:鼠标移动是mousemove事件阿,就算是mousedown事件,都一样没反应
      

  6.   

    tip显示了,证明程序响应了MOUSEMOVE事件,没有响应WM_RBUTTONUP和WM_LBUTTONUP是因为其它原因,把你完整的代码贴上来
      

  7.   

    晕,但我在mousemove事件打上了断点,但根本没有执行到哪儿阿,整个程序帖上来好长阿
    大概有那些原因会导致这种情况呢?
      

  8.   

    我找出原因了,我的窗体本来是最大化,要点击中间的哪个Normal,状态栏的图标才有反应,一切都行,但最大化一切都不行,又是个新问题,呵呵