我没有代码,但能解决问题:Function MouseHookProc(ByVal code As Long, ByVal wParam As Long, _
                 ByVal lParam As Long) As Long
其中lParam指向MOUSEHOOKSTRUCT 结构
这个结构中包含了对象的句并(hwnd),只要判断是否
是 form2的句并就可以了。代码不麻烦,你可以试试(需要用的CopyMemory函数)  If code < 0 Then
     MouseHookProc = CallNextHookEx(hHook, code, wParam, lParam)
     Exit Function
  End If
  If wParam = WM_RBUTTONDOWN Or wParam = WM_RBUTTONUP Then
      form2.aa
      Exit Function
  End If
  MouseHookProc = 0 '表示要处理这个讯息
  Call CallNextHookEx(hHook, code, wParam, lParam)
 End Function

解决方案 »

  1.   

    推荐你使用 SetWindowLong 子类化来处理 Form2,同样可以处理
    WM_RBUTTONDOWN Or WM_RBUTTONUP .
    但为什么?直接在 Form2 里面使用 MouseDow or MouseUp 事件不行吗?
      

  2.   

    你不是帮别人解答过吗?怎么又来问?
    http://www.csdn.net/expert/topic/698/698939.xml?temp=.8775141
      

  3.   

    Hook 你都会了,自己看 Win32
      

  4.   

    Option ExplicitPublic Const WH_MOUSE = 7
     Public Const WM_RBUTTONDOWN = &H204
     Public Const HC_ACTION = 0
     Public Const WM_RBUTTONUP = &H205 Declare Function SetWindowsHookEx Lib "user32" Alias _
        "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, _
        ByVal hmod As Long, ByVal dwThreadId As Long) As Long
     Declare Function UnhookWindowsHookEx Lib "user32" _
        (ByVal hHook As Long) As Long
     Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _
        ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
     Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
       (lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long)
     'Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
     Public theForm As Form
     Public hHook As Long   ' handle of Hook Procedure
     Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
     Type POINTAPI
            x As Long
            y As Long
    End Type Type MOUSEHOOKSTRUCT
         pt As POINTAPI
        hwnd As Long
        wHitTestCode As Long
         dwExtraInfo As Long
    End Type
     
     
     Sub EnableHook()
        If hHook = 0 Then
           hHook = SetWindowsHookEx(WH_MOUSE, AddressOf MouseHookProc, App.hInstance, 0)
        End If
     End Sub
     Sub FreeHook()
     Dim ret As Long
     If hHook <> 0 Then
        ret = UnhookWindowsHookEx(hHook)
        hHook = 0
     End If
     End Sub
     Function MouseHookProc(ByVal code As Long, ByVal wParam As Long, _
                     ByVal lParam As Long) As Long
        
      If code < 0 Then
         MouseHookProc = CallNextHookEx(hHook, code, wParam, lParam)
         Exit Function
      End If
      Dim ms As MOUSEHOOKSTRUCT
      CopyMemory ms, lParam, Len(ms)
      If (wParam = WM_RBUTTONDOWN Or wParam = WM_RBUTTONUP) And ms.hwnd = Form2.hwnd Then
          Form2.aa
          Exit Function
      End If
      MouseHookProc = 0 '表示要处理这个讯息
      Call CallNextHookEx(hHook, code, wParam, lParam)
     End Function
      

  5.   

    取得form2上的控件的句柄怎么做啊?
      

  6.   

    Form2.Hwnd
    Form2.command1.hwnd
    form2.picture1.hwnd
    就这样啊!
      

  7.   


    那当然就没办法了,很多VB控件是虚拟控件,没有HWND。
      

  8.   

    'form1
    Option ExplicitPrivate Sub Form_Load()
      Form2.Show
    End Sub'form2
    Option ExplicitPrivate Sub Form_Load()
       InitHook1 Me.hWnd
      End Sub Sub aa()
      MsgBox "a", vbOKOnly, "a"
     End Sub'module
    Option ExplicitPrivate 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
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPrivate Const WM_LBUTTONDOWN = &H201
    Private Const WM_LBUTTONUP = &H202
    Private Const WM_MOUSEMOVE = &H200
    Private Const WM_RBUTTONDBLCLK = &H206
    Private Const WM_RBUTTONDOWN = &H204
    Private Const WM_RBUTTONUP = &H205
    Private Const GWL_WNDPROC = (-4)
    Private prevWndProc As LongFunction WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Select Case Msg
        Case WM_RBUTTONUP
            MsgBox "a"
        Case Else
            WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
        End Select
    End FunctionPublic Sub InitHook1(ByVal hw As Long)
    prevWndProc = GetWindowLong(hw, GWL_WNDPROC)
    Call SetWindowLong(hw, GWL_WNDPROC, AddressOf WndProc)
    End Sub