我把TextBox锁定后(Locked=true),还是可以点击右键菜单,然后粘贴改变控件的值。有没有办法,使得Lock以后,屏蔽右键菜单功能?
(我不想把TextBox的Enabled设为False,因为觉得难看。也不想在每个TextBox的鼠标事件中写代码,因为很多,每个都这样处理太麻烦,请提供其他办法)
非常感谢各位!

解决方案 »

  1.   

    我有个不完善的办法(Set Text1 = TextBox):
    在Textbox的MouseDown事件中判断鼠标按键是否为右键:
    If Button=vbRightButton Then
      Text1.Enabled=False
    End If
    在MouseUp事件中:
    Text1.Enabled=True这样就可以了.即鼠标右键按下时临时禁用TextBox.如果必须按题设中的要求,那可能要用HOOK拦截Menu的Initialize事件了,很麻烦,不过是治本的办法.别问我,我不会.
      

  2.   

    加上这个代码
    Private Sub Form_Load()
    Text1.MaxLength = Len(Text1.Text)
    End Sub
      

  3.   

    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
      

  4.   

    Option ExplicitPrivate Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)If KeyCode = vbKeyControl Then  If Len(Clipboard.GetText) > 0 Then      Clipboard.Clear  End IfEnd IfEnd SubPrivate 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 IfEnd SubPrivate 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 IfEnd Sub
    'Module1:Option ExplicitPublic 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 LongPublic Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPrivate 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 SubClass1_WndMessage(ByVal hWnd As OLE_HANDLE, ByVal Msg As OLE_HANDLE, ByVal wp As OLE_HANDLE, ByVal lp As Long) As LongIf Msg = WM_CONTEXTMENU Then   SubClass1_WndMessage = TrueElse   SubClass1_WndMessage = CallWindowProc(OldWindowProc, hWnd, Msg, wp, lp)   ' 如果消息不是WM_CONTEXTMENU,就调用默认的窗口函数处理End IfEnd Function