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不知道有没有少什么定义,你可以试一试
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不知道有没有少什么定义,你可以试一试
答:方法是这样的:
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是你建立的菜单的名称
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
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