能不能提供一些代码!
mouse_move怎么响应!
而WM_MENUSELECT又怎么拦截呢?

解决方案 »

  1.   

    代码 Form1:
    Option Explicit
    Private Sub Form_Load()
        Dim d As String
        
        d = SubClass(Form1)
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        SetWindowLong Me.hWnd, GWL_WNDPROC, lProcOld
    End Sub代码 Module1
    Option ExplicitDeclare Function AppendMenu Lib "user32" Alias _
    "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags _
    As Long, ByVal wIDNewItem As Long, ByVal _
    lpNewItem As String) As LongDeclare Function GetSystemMenu Lib "user32" _
    (ByVal hWnd As Long, ByVal bRevert As Long) As Long
    Declare Function SetWindowLong Lib "user32" _
    Alias "SetWindowLongA" (ByVal hWnd As Long, _
    ByVal nIndex As Long, ByVal dwNewLong As Long) As LongDeclare 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 GetMenuString Lib "user32" Alias "GetMenuStringA" _
        (ByVal hMenu As Long, ByVal wIDItem As Long, _
        ByVal lpString As String, ByVal nMaxCount As Long, _
        ByVal wFlag As Long) As LongPublic Const WM_SYSCOMMAND = &H112
    Public Const MF_SEPARATOR = &H800&
    Public Const MF_STRING = &H0&
    Public Const GWL_WNDPROC = (-4)
    Public Const IDM_ABOUT As Long = 1010
    Public Const WM_MENUSELECT = &H11FPublic lProcOld As LongPublic Function SysMenuHandler(ByVal hWnd _
            As Long, ByVal iMsg As Long, ByVal wParam _
            As Long, ByVal lParam As Long) As Long
        Dim x As Long
        Dim astr As String * 256
        
        On Error GoTo errsub
        If iMsg = WM_SYSCOMMAND Then
            If wParam = IDM_ABOUT Then
                MsgBox "About . . .", vbInformation, "About"
                Exit Function
            End If
        ElseIf iMsg = WM_MENUSELECT Then
            x = Hex(wParam) And &HFF
            GetMenuString lParam, x, astr, 256, 0
            
            If astr <> "" Then
                Form1.Label1.Caption = astr
            End If
        End If
        SysMenuHandler = CallWindowProc(lProcOld, _
        hWnd, iMsg, wParam, lParam)
    errsub:
        Exit Function
    End FunctionPublic Function SubClass(FormName As Form)
        Dim lhSysMenu As Long, lRet As Long    lhSysMenu = GetSystemMenu(FormName.hWnd, 0&)
        lRet = AppendMenu(lhSysMenu, MF_SEPARATOR, 0&, vbNullString)
        lRet = AppendMenu(lhSysMenu, MF_STRING, IDM_ABOUT, "About...")
        
        FormName.Show
        lProcOld = SetWindowLong(FormName.hWnd, GWL_WNDPROC, _
        AddressOf SysMenuHandler)
    End Function
      

  2.   

    你可以取得鼠标得当前位置 看是否在菜单栏的范围内 那么就可以执行mouse_move事件
      

  3.   

    to TechnoFantasy(www.applevb.com) 我试过你的代码,不过一运行就出错并退出VB
      

  4.   

    在我的机器上没有问题,这里包含两个功能,一个是根据光标下的菜单显示菜单项,另外
    一个是在系统菜单上添加菜单,你可以将函数 SubClass 去掉,另外将 SysMenuHandler
    中的
    If iMsg = WM_SYSCOMMAND Then
            If wParam = IDM_ABOUT Then
                MsgBox "About . . .", vbInformation, "About"
                Exit Function
            End If
    部分去掉,如果还是不行再告诉我。