TextBox的问题,设为locked=true后,虽然不可以从键盘输入,但可从右键的弹出菜单中的"粘贴"拷贝进去,有什么办法能将这个弹出菜单项不可用吗?

解决方案 »

  1.   

    http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=137587
      

  2.   

    http://expert.csdn.net/Expert/topic/1694/1694613.xml?temp=.7921564
      

  3.   

    我有个不完善的办法(Set  Text1  =  TextBox):  
    在Textbox的MouseDown事件中判断鼠标按键是否为右键:  
    If  Button=vbRightButton  Then  
       Text1.Enabled=False  
    End  If  
    在MouseUp事件中:  
    Text1.Enabled=True  
     
    这样就可以了.即鼠标右键按下时临时禁用TextBox.  
     
    如果必须按题设中的要求,那可能要用HOOK拦截Menu的Initialize事件了,很麻烦,不过是治本的办法.别问我,我不会.  
    ---------------------------------------------------------------  
     
    Private  Sub  Text1_MouseDown(Button  As  Integer,  Shift  As  Integer,  X  As  Single,  Y  As  Single)  
         If  Button  =  2  Then  
           Me.PopupMenu  menu  
         End  If  
    End  Sub  
    ---------------------------------------------------------------  
     
    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  
     
      

  4.   

    http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=137587
      

  5.   

    谢谢大家! ufozq77(ZQ)的方法我用过了,可以实现,但要是有多个TextBox(10以上)的话,必须要有多个保存消息处理函数地址的变量,又不太好了,还有没有更好的办法呀?!