thanks

解决方案 »

  1.   

    '禁止Form1中textbox右键代码:Option Explicit
    Private Sub Form_Load()
     Call Hook(Text1.hWnd)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
       Call UnHook
    End Sub'Model1代码:Public 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
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Const GWL_WNDPROC = -4
    Public Const WM_RBUTTONUP = &H205
    Public lpPrevWndProc As Long
    Private lngHWnd As LongPublic Sub Hook(hWnd As Long)
      lngHWnd = hWnd
      lpPrevWndProc = SetWindowLong(lngHWnd, GWL_WNDPROC, AddressOf WindowProc)
    End SubPublic Sub UnHook()
    Dim lngReturnValue As Long
    lngReturnValue = SetWindowLong(lngHWnd, GWL_WNDPROC, lpPrevWndProc)
    End SubFunction WindowProc(ByVal hw As Long, ByVal uMsg As Long, _
       ByVal wParam As Long, ByVal _
       lParam As Long) As Long
       Select Case uMsg
    '检测鼠标击键消息,如果是单击右键
       Case WM_RBUTTONUP
    '什么事也不做或弹出自己定制的菜单
    '    MsgBox "right button clicked."
        Case WM_CUT, WM_COPY, WM_PASTE    Exit Function
       Case Else
    WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
       End Select
    End Function
      

  2.   

    Private Sub Form_Load()
        EnumChildWindows Me.hwnd, AddressOf EnumChildProc, ByVal 0&
    End Sub========================================================================
    'Module1:
    Private Type WNDCLASS
        style As Long
        lpfnwndproc As Long
        cbClsextra As Long
        cbWndExtra2 As Long
        hInstance As Long
        hIcon As Long
        hCursor As Long
        hbrBackground As Long
        lpszMenuName As String
        lpszClassName As String
    End TypePublic Declare Function GetClassInfo Lib "user32" Alias "GetClassInfoA" (ByVal hInstance As Long, ByVal lpClassName As String, lpWndClass As WNDCLASS) As Long
    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
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Public Const WM_RBUTTONDBLCLK = &H206
    Public Const WM_RBUTTONDOWN = &H204
    Public Const WM_RBUTTONUP = &H205
    Public Const GWL_WNDPROC = (-4)
    Public Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
    Public hRgn As Long, prevWndProc As LongPublic Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
        Dim WC As WNDCLASS
        'Get class info
        GetClassInfo hwnd, "Edit", WC
        
        If WC.lpszClassName = "Edit" Then
            prevWndProc = GetWindowLong(hwnd, GWL_WNDPROC)
            SetWindowLong hwnd, GWL_WNDPROC, AddressOf WndProc
        End If
            EnumChildProc = 1
        
    End FunctionPublic Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    On Error GoTo ShowErr
        
        If Msg = WM_RBUTTONDBLCLK Or Msg = WM_RBUTTONDOWN Or Msg = WM_RBUTTONUP Then
            Exit Function
        End If
        
        WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
        Exit Function
    ShowErr:
        MsgBox Err.Source & "-" & Err.Description
    End Function
      

  3.   

    楼上2个都可以,一个是用的 HOOK ,缺点是很容易引起系统崩溃。我的是用枚举的子窗口消息,缺点是速度慢些
      

  4.   

    sorry,这个函数的几个参数分别要填什么东西啊?如果我要屏蔽一个TextBox中的鼠标右健。EnumChildWindows Me.hwnd, AddressOf EnumChildProc, ByVal 0&thanks a lot
      

  5.   

    好像这样做把鼠标右键给屏蔽掉了,但是如果我需要用自己的popupmenu 呢?