txtName为文本框Private Sub txtName_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Call txtMouseDown(txtName, Button)
End SubPrivate Sub txtName_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Call txtMouseUp(txtName, Button)
End Sub
Public Sub txtMouseDown(curObject As TextBox, Button As Integer)
    If Button = 1 Then Exit Sub
    OldWindowProc = GetWindowLong(curObject.hWnd, GWL_WNDPROC)
    ' 取得窗口函数的地址
    Call SetWindowLong(curObject.hWnd, GWL_WNDPROC, AddressOf SubClass1_WndMessage)
    ' 用SubClass1_WndMessage代替窗口函数处理消息End SubPublic Sub txtMouseUp(curObject As TextBox, Button As Integer)
    If Button = 1 Then Exit Sub
    Call SetWindowLong(curObject.hWnd, GWL_WNDPROC, OldWindowProc)
    ' 恢复窗口的默认函数
'        PopupMenu usermenu
    ' 弹出自定义菜单
End Sub
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 LongPublic OldWindowProc 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 = CallWindowProc(OldWindowProc, hWnd, Msg, wp, lp)
        ' 如果消息不是WM_CONTEXTMENU,就调用默认的窗口函数处理
        Exit Function
    End If
    SubClass1_WndMessage = True
End Function
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 WM_LBUTTONDOWN = &H201
Public Const WM_RBUTTONDOWN = &H204
Public Const GWL_WNDPROCHOU = (-4)
Public Const WM_CONTEXTMENU = &H7B
Public Const MF_STRING = &H0&
Public Const MF_BYCOMMAND = &H0&
Public Const SC_CLOSE = &HF060不知道有没有少什么定义,你可以试一试

解决方案 »

  1.   

    问:如何在vb的文本框等等控件的系统右键菜单里追加自己定义的菜单。
    答:方法是这样的:
    If Button = vbRightButton Then
    ' Make VB discard the mouse capture.
    Text1.Enabled = False
    Text1.Enabled = True' Display the custom menu.
    PopupMenu Menu1
    End If其中Menu1是你建立的菜单的名称
      

  2.   

    先在标准模块写:
    Option ExplicitPublic Const GWL_WNDPROC = (-4)
    Public Const WM_RBUTTONDOWN = &H204Declare 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
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic prevWndProc As LongFunction WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        If Msg = WM_RBUTTONDOWN Then
        Else
            WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
        End If
    End Function窗体:Private Sub Command1_Click()
        prevWndProc = GetWindowLong(Text1.hWnd, GWL_WNDPROC)
        SetWindowLong Text1.hWnd, GWL_WNDPROC, AddressOf WndProc
        Command1.Enabled = False
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        If prevWndProc <> 0 Then
            SetWindowLong Text1.hWnd, GWL_WNDPROC, prevWndProc
            prevWndProc = 0
        End If
    End Sub
      

  3.   

    模块:
    Public Const GWL_WNDPROC = (-4)
    Public Const WM_RBUTTONDOWN = &H204Declare 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
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic prevWndProc As LongFunction WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        If Msg = WM_RBUTTONDOWN Then
        Else
            WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
        End If
    End Function窗体:
    Private Sub Command1_Click()
        prevWndProc = GetWindowLong(Text1.hWnd, GWL_WNDPROC)
        SetWindowLong Text1.hWnd, GWL_WNDPROC, AddressOf WndProc
        Command1.Enabled = False
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        If prevWndProc <> 0 Then
            SetWindowLong Text1.hWnd, GWL_WNDPROC, prevWndProc
            prevWndProc = 0
        End If