如何屏蔽text控件中鼠标右键显示的粘贴、复制等功能,即使用使用快键也不能改变其值,如用API要求Win系统都能通过

解决方案 »

  1.   

    在TEXT控件的MOUSEDOWN事件中添加如下代码:
    text1.enable=False
    text1.enable=true
      

  2.   

    试试看Form1代码:Option Explicit
    Private Sub Form_Load()
     Call Hook(Text1.hWnd)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
       Call UnHook
    End SubModel1代码: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."
        Exit Function
       Case Else
    WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
       End Select
    End Function
      

  3.   

    SoHo_Andy(冰) 你的方法可行,但无法解决ctrl+v等快键问题。
      

  4.   

    解决快捷键问题Dim strTemp As String
    Dim isCtrl As Boolean
    Private Sub Form_Load()
        isCtrl = False
    End SubPrivate Sub Text1_Change()
        If isCtrl = True Then
            Text1.Text = strTemp
            isCtrl = False
        End If
    End SubPrivate Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
        If KeyCode = vbKeyControl Then
            isCtrl = True
            strTemp = Text1.Text
        End If
    End Sub
      

  5.   

    SoHo_Andy(冰) 你的第二个解决方法出现bug,就是当点住ctrl不放,然后不停点击V键,则出现ctrl+V键效果。
      

  6.   

    呵呵,你再判断按v键时,ctrl键是否被按下
    Text1_KeyDown(KeyCode As Integer, Shift As Integer)
    用shift (shift and 2)=2 表示按了ctrl
      

  7.   

    1. 屏蔽Windows弹出菜单
    2. 当该控件获得焦点时清空剪贴板
      

  8.   

    拦截掉文本框的WM_Copy、WM_Cut、WM_Paste消息
      

  9.   

    将 SoHo_Andy(冰) 的“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 = -4Private Const WM_CUT As Long = &H300
    Private Const WM_COPY As Long = &H301
    Private Const WM_PASTE As Long = &H302Public 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_CUT,WM_COPY,WM_PASTE
        Exit Function
       Case Else
    WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
       End Select
    End Function
      

  10.   

    来学习~~~~~~~~
    1. 屏蔽Windows弹出菜单
    2. 当该控件获得焦点时清空剪贴板
    这种方法有没有实例?Thanks 
      

  11.   

    用API的方法该功能不能进行断点调试,因为采用了拦截Windows系统消息,容易造成系统退出,故采用一般的方法,直接清空剪贴板可以完成,数据交换采用的剪贴板,即便粘贴也是空的数据。
      

  12.   

    再土一点办法 就是 mousedown 事件中 如果是 右键点击 弹出 MSGBOX  这样 就直接屏蔽 复制张贴!!
      

  13.   

    综合zyl910(910:分儿,我又来了!) 和SoHo_Andy(冰)两人的可以实现,,,厉害,,厉害!!!:)
      

  14.   

    Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 2 Then MsgBox "无效点击"End Sub这样满足你要求吗?
      

  15.   

    问题根源在于不让用户从剪贴板中粘贴数据,直接搞定数据源不就OK了。屏蔽了Windows系统菜单,但是还要处理Windows快捷键,实在是很复杂。
      

  16.   

    无法解决windows快键问题,即ctrl+v等键,现在需要这样的程序,即不弹出复制、粘贴又无法使用ctrl+v等键程序。
      

  17.   

    在MouseDown中:
    Clipboard.Clear    '清除剪贴板内容
    在快捷键中再进行一次判断不就行了?