文本框即系统自带Ctrl+V的粘贴功能,而这一功能比我自已用菜单做的粘贴事件的优先级要高,而程序中我必须对将要粘贴过来的文本进行控制,不知该如何实现?

解决方案 »

  1.   

    需要用api的,你去那里提问吧,应该会找到答案!!!要不就搜搜SetWindowLong函数的用法,肯定会有收获!!
      

  2.   

    我试过了,
    在keydown,keyup中拦截keycode = v 不行.
    看来只有用字类了.
      

  3.   

    监视剪贴板变化或者拦截wm_paste消息进行处理
      

  4.   

    新建一个工程,在上面加入一个文本框控件!加入如下代码!
    窗体代码:
    Option ExplicitPrivate Sub Form_Load()
        Call Hook(Text1.hWnd)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Unhook
    End Sub添加一个模块~
    模块代码:
    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 Const GWL_WNDPROC = (-4)Global lpPrevWndProc As Long
    Global gHW As Long
    Public Sub Hook(ChWnd As Long)
       gHW = ChWnd
       lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf gWindowProc)
    End SubPublic Sub Unhook()
       Dim temp As Long
       temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
    End SubPublic Function gWindowProc(ByVal hWnd As Long, ByVal Msg As Long, _
                     ByVal wParam As Long, ByVal lParam As Long) As Long
       If Msg = 770 Then
          '在这里调用你的处理函数
          gWindowProc = True
       Else ' Send all other messages to the default message handler
          gWindowProc = CallWindowProc(lpPrevWndProc, hWnd, Msg, wParam, lParam)
       End If
       
    End Function
      

  5.   

    受用。这里的"770"是否代表Ctrl+V的消息号?如果是,则对RichTextBox没用。请楼上再帮一个小忙。马上结贴!
      

  6.   

    如果用Text控件,则右键会出现两个菜单,一个是系统自带,另一个是自己定义的,如何解决不用系统右键不弹出的问题?
      

  7.   

    不知道楼主的意思是什么,既然都是复制粘贴,有什么不一样的吗?如果你是想把剪贴板里的内容进行编辑,我看你只能把系统的粘贴给屏蔽了,包括热键,在使用sendmessage屏蔽了系统右键菜单后使用自己的右键菜单,进行自己的操作
      

  8.   

    如果你是想屏蔽CTRL+v,需要注意的是你自己也用不了这个热键了要是想屏蔽,不需要那么麻烦,用KEYPRESS和keydown就可以了
      

  9.   

    那里的770其实就是版主提到的WM_PASTE常数的值!由于我忘了~所以就直接打印出来看着写上去的!
    你想不让他出现右键菜单,WM_CONTEXTMENU = &H7B 用这个常数去做判断条件就行了(这是对于标准的Windows控件TextBox来说的)!
    至于RichTextBox那东西的,它是不是用这个值我不知道.但你想要那个值就把那些IF语句先注释起来~用Debug.print msg 触发它的事件看看输出窗口就知道!当然,其中还包括很多其它消息!那得知己去判断了~!
      

  10.   

    还有一样~RichTextBox有一个AutoVerbMenu的属性!你只要把这属性设为Flash!它的右键菜单也就不会弹出来了!