怎不让Text控件弹出右键菜单

解决方案 »

  1.   

    '禁止TextBox右键
    'Form1代码: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.   

    冰哥哥
    你的代码是不是有点小问题?
    人家要的是在TEXT里不能又右键
    你怎么把右键整个屏蔽了?
      

  3.   

    Option Explicit
    Public OldWindowProc As Long
    '保存默认的窗口函数的地址
    Public Const WM_CONTEXTMENU = &H7B
    '当右击文本框时,产生这条消息
    Public Const GWL_WNDPROC = (-4)
    Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex 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 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 LongPublic Function MyMesg(ByVal hWnd As OLE_HANDLE, ByVal Msg As OLE_HANDLE, ByVal wp As OLE_HANDLE, ByVal lp As Long) As Long
    If Msg <> WM_CONTEXTMENU Then
    MyMesg = CallWindowProc(OldWindowProc, hWnd, Msg, wp, lp)
    '如果消息不是WM_CONTEXTMENU,就调用默认的窗口函数处理
    Exit Function
    End If
    MyMesg = True
    End FunctionPrivate Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 1 Then Exit Sub
    OldWindowProc = GetWindowLong(Text1.hWnd, GWL_WNDPROC)
    '取得窗口函数的地址
    Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, AddressOf MyMesg)
    '用MyMesg代替窗口函数处理消息
    End SubPrivate Sub Text1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 1 Then Exit Sub
    Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, OldWindowProc)
    '恢复窗口的默认函数
    '弹出自定义菜单
    End Sub
      

  4.   

    我来解释一下上面的程序
    把WINDOWS操作系统看作人的大脑,它接收、处理、并发送各种各样的信息给我们的各个应用程序,也就是说它是消息的中枢。而每个应用程序(甚至每一个按钮、标签、窗体等等统称为窗口)在运行时都会被分配一个窗口过程WINDOWPROC,由这个窗口过程来接收和处理操作系统发来的消息(实际上存在一个消息队列),通常情况下这个窗口过程是由操作系统指定的,它会自动的响应并处理一些WINDOWS消息(如窗体移动、最大化、最小化、错误信息等),但也可由我们自己编写这个消息处理程序,不过还得借助API函数的威力了,怎么用?我们还是先看看这些API函数的定义和参数吧。   程序中用到了CallWindowProc、SetWindowLong两个API函数,其中CallWindowProc函数用来发送消息到一个指定的窗口过程;而使用SetWindowLong函数来为窗口结构中为指定的窗口设置属性。使用API函数之前必须先在程序中声明如下:
    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
    '其中各参数的意义如下表: 'CallWindowProc函数参数意义
    'lpPrevWndFunc  Long,原来的窗口过程地址
    'HWnd Long,窗口句柄
    'Msg Long,发送的消息
    'wParam Long,消息类型,参考wParam参数表
    'lParam Long,依据wParam参数的不同而不同
    '  返回值 Long,依据发送的消息不同而变化'SetWindowLong函数参数意义
    'hwnd  Long,欲为其取得信息的窗口的句柄
    'nIndex Long,请参考GetWindowLong函数的nIndex参数的说明 ,其值如下:
        'GWL_EXSTYLE 得到扩展窗口风格
        'GWL_STYLE 得到窗口风格
        'GWL_WNDPROC 得到窗口过程的地址, 或指向一个窗口过程地址的句柄. 必须用 CallWindowProc 函数来调用这个窗口过程
        'GWL_HINSTANCE 得到应用程序的实例句柄.
        'GWL_HWNDPARENT 得到父窗口的句柄.
        'GWL_ID 得到窗口标志.
        'GWL_USERDATA 得到与该窗口有关的一个32位值. 每个窗口都有一个32位值来给创建这个窗口的应用程序使用。
        '当hWnd指向一个对话框时,hIndex还可取下列值
        'DWL_DLGPROC 得到对话框过程的地址, 或指向一个对话框过程地址的句柄. 必须用 CallWindowProc 函数来调用这个窗口过程
        'DWL_MSGRESULT 得到在对话框中一个信息的处理结果的值
        'DWL_USER 得到应用程序一个额外的私有信息, 如句柄或指针.
    'dwNewLong Long,由nIndex指定的窗口信息的新值
    '返回值 Long,指定数据的前一个值'我们要自己写程序来处理消息,必须先更改窗口的属性,从原来由默认的窗口过程来处理
    '消息变成由我们自己写的消息处理过程来处理消息。方法是使用SetWindowLong函数来
    '取得默认窗口过程的地址,然后转向为我们自己写的窗口过程的地址,具体的实现方法如下代码:
    '注释:GWL_WNDPROC常量的含义见上面的参数SetWindowLong介绍,AddressOf是取址函数, 
    WindowProc是我们写的过程
    lpPrevWndProc = SetWindowLong(lngHWnd, GWL_WNDPROC, AddressOf WindowProc)lpPrevWndProc就是有系统指定的原消息处理函数的地址
    下面看一看自己编写的消息处理函数的定义,注意,这个定义是固定的
    WindowProc(ByVal hw As Long, ByVal uMsg As Long, _
       ByVal wParam As Long, ByVal _
       lParam As Long) As Long
    该函数的4个参数都在使用SetWindowLong函数时由系统自动获得,不需自己指定,其中
    hw为窗口的句柄,uMsg为系统发送来的消息,它的值为WM_RBUTTONUP时代表该消息为鼠标右键弹起,wParam和lParam的含义由uMsg消息来决定。
    明白了吗?
      

  5.   

    下面的方法可以简单实现屏蔽系统菜单,但要有一个自己定义的菜单;
    如果连自己的菜单也不弹出,我就不知道怎么办啦,替你关注。
    Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
      If Button = 2 Then
        Text1.Enabled = False
        Text1.Enabled = True
        Me.PopupMenu menuNone'自定义菜单
      
      End If
    End Sub
      

  6.   

    button=2的时候把它变一个值就行了,或者设为button=1,变成左键,要不就=3
      

  7.   

    把 SoHo_Andy(冰) 前面改一下啊:
    Option Explicit
    Private Sub Form_Load()
     Call Hook(Text1.hWnd)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
       Call UnHook
    End Sub改为Private Sub Text1_OnMouseIn(......)
     Call Hook(Text1.hWnd)
    End SubPrivate Sub Text1_OnMouseOut(......)
       Call UnHook
    End Sub可能是这两个事件。机器上没VB,没有试!^_^!
      

  8.   


       没那么复杂吧!不就是在text控件的MouseDown或MouseUp事件中加入:
          if button=2 then
            PopupMenu mnuMyMenu    '其中mnuMyMenu是事先在menu控件中存在的菜单        
          endif
       这不就OK了,真搞不懂All of you!
      

  9.   

    To longki(代码狂人):哈哈,你这招也管用,不过有点偷工减料~ 不是楼主的原意哦
      

  10.   

    to longki(代码狂人) 写程序不是靠想象的,你试试就知道了你认为不复杂的原因是因为你水平不高
    你认为复杂的原因还是因为你水平不高