text控件的拷贝和粘贴功能是系统的,所以无法禁止。

解决方案 »

  1.   

    Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyControl Then
       If Len(Clipboard.GetText) > 0 Then
          Clipboard.Clear
       End If
    End If
    End Sub
      

  2.   

    另外 内置鼠标右键菜单也要屏蔽(API Hook)
    'Form1: Text1
    Option Explicit
    Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyControl Then
      If Len(Clipboard.GetText) > 0 Then
          Clipboard.Clear
      End If
    End If
    End Sub
    Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = vbRightButton Then
       OldWindowProc = GetWindowLong(Text1.hWnd, GWL_WNDPROC)
       ' 取得窗口函数的地址
       Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, AddressOf SubClass1_WndMessage)
       ' 用SubClass1_WndMessage代替窗口函数处理消息
    End If
    End Sub
    Private Sub Text1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = vbRightButton Then
       Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, OldWindowProc)
       ' 恢复窗口的默认函数   ' 弹出自定义菜单
    End If
    End Sub'Module1:
    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
    Private 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 Function SubClass1_WndMessage(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
       SubClass1_WndMessage = True
    Else
       SubClass1_WndMessage = CallWindowProc(OldWindowProc, hWnd, Msg, wp, lp)
       ' 如果消息不是WM_CONTEXTMENU,就调用默认的窗口函数处理
    End If
    End Function
      

  3.   

    上位老兄有点”言重“了吧:
    更简单的方法:
    在Keydown事件下
    if (keycode=118 or keycode=86)and shift=2 then 
    text1.locked=true
    end if 
    然后再在Keyup事件中加
    text1.locked=false
    不就ok了嘛!!!!
    Easy!!!
    有空多交流:[email protected]
      

  4.   

    1、我的Text控件是隐藏的,用户不可见,可以不用屏蔽鼠标。 2、希望能够提供Clipboard.Clear 之外的办法。 
    最好是能够截获"Ctrl+V",然后取消它。 
    就像keypress中一样,可以把Keyascii赋值为零来截获键盘输入,并取消不合规则的输入。3、我试着使用SendMessage: 
        If (KeyCode = 86 Or KeyCode = 118) And CtrlDown Then 
               Beep 
               '屏蔽 
               SendMessage TextInput.hwnd, EM_SETREADONLY, True, ByVal 0& 
        Else 
               '恢复 
               SendMessage TextInput.hwnd, EM_SETREADONLY, False, ByVal 0& 
        End If 
    同时又出现新的问题 
    该text控件用于接受汉字输入,若SendMessage给它,设为只读,则此时中文输入法被取消,当再次按下按键,Sendmessage会取消它的只读,中文输入法恢复,但此时Text控件首先已收到一个英文字母,然后才能输入汉字。请问如何避免此英文字母的输入,让Text控件立即能接收到汉字。SJSOFT(E品风华)朋友的方法与此法类是。希望大家能够提供更好的方法,否则只能用Clipboard.Clear 了。
      

  5.   

    得,简单起见还是用Clipboard.Clear 了。
      

  6.   

    为什么换成Richtextbox上面的方法就失效了呢?
    我用Clipboard.Clear 后,但剪切板好像没有执行这条命令,那位大侠知道为何?