如何取消textbox的右键菜单????谢谢

xingqingboy 2003-01-12 01:35:37
如何取消textbox的右键菜单????谢谢
...全文
28 点赞 收藏 5
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qingfenge 2003-01-12
jennyvenus(AdvancedFollowTimes) 的第一种方法可能行得通(我还没试过的),但第二个简单方法应该不能屏蔽键盘产生的右键菜单吧?
回复
好吃的肥牛 2003-01-12
回复
在开始之前我们先看一下Windows的工作机制,其实Windows无时无刻都在发送着消息,只是没有相应的程序去响应罢了!比如用户移动或单击了鼠标,或者按下了键盘上的某个键,windows都会发出相应的消息通知窗口。而我们要做的就是扑获Windows所发出的这条消息,然后用VB的 AddressOf 关键字来取代它。
我们这次的目标就是扑获WM_CONTEXTMENU这条消息,它在右击文本框时产生。
程序需要一个窗体、一个文本框,一个标准模块,一个菜单菜单名为mymenu。

'模块的代码:
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
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 Long

Public Function MyMesg(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
MyMesg = CallWindowProc(OldWindowProc, hWnd, Msg, wp, lp)
'如果消息不是WM_CONTEXTMENU,就调用默认的窗口函数处理
Exit Function
End If
MyMesg = True
End Function

窗体的代码:
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then Exit Sub
OldWindowProc = GetWindowLong(Text1.hWnd, GWL_WNDPROC)
'取得窗口函数的地址
Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, AddressOf MyMesg)
'用MyMesg代替窗口函数处理消息
End Sub

Private Sub Text1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then Exit Sub
Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, OldWindowProc)
'恢复窗口的默认函数
PopupMenu mymenu
'弹出自定义菜单
End Sub

第二中方法:对了还有更简单的一个方法
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Text1.Enabled = False
Text1.Enabled = True
PopupMenu mymenu
End Sub
搞定简单吧!(^_^)
尽量不要使用 AddressOf 来改变一个窗口的默认窗口函数,VB不擅长做这类的工作。
回复
twinking 2003-01-12
是不是可以考虑用textbox的KEYPRESS事件
来忽略
回复
ccbl 2003-01-12
在MOVEDOWN事件中,将BUTTON=2(好象是右建)过滤掉,你试试
回复
发动态
发帖子
VB基础类
创建于2007-09-28

7453

社区成员

VB 基础类
申请成为版主
社区公告
暂无公告