不用 API 也可以实现。添加一个定时器控件 Timer1在文本框的 MouseDown 事件中编写以下代码: if Button=2 then text.Enable=false也就是说当按下鼠标右键则文本框不可用,此时便不会弹出右键菜单了。接着须将文本框还原为可用,即 text.Enable=True这时你就利用 Timer 控件了。设置 Timer 每隔 0.2 秒(时间短一点好些)检查一次文本框是否可用。如不可用,则将其 Enable 属性设为 True .这样也就达到了隐藏右键菜蛋,同时又不影响文本框响应事件的目的了。(如果觉得可以,就给几分看看:)
用API怎么实现阿?谁给点代码(学习中) 马上结帖!!!!!!!
'模块中 Public OldWinProc 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 SubClass_WndMessage(ByVal hwnd As _ OLE_HANDLE, ByVal Msg As OLE_HANDLE, ByVal wParam As OLE_HANDLE, _ ByVal lParam As Long) As Long If Msg <> WM_CONTEXTMENU Then SubClass_WndMessage = CallWindowProc(OldWinProc, _ hwnd, Msg, wParam, lParam) ' 如果消息不是WM_CONTEXTMENU,就调用系统的窗口处理函数 Else SubClass_WndMessage = True End If
End Function '窗体中,放一TextBox Option ExplicitPrivate Sub Form_Load() OldWinProc = GetWindowLong(Text1.hwnd, GWL_WNDPROC) SetWindowLong Text1.hwnd, GWL_WNDPROC, AddressOf SubClass_WndMessageEnd Sub
居然不给分:( 好,我再来如果你想用 API 来实现,那才是最好的解决方法。先在一般模块中声明两个 API 函数:SetWindowLong 和 CallWindowProc,已经声明常数 WM_RBUTTONDOWN(这些都可以在 API 浏览器中找到)。接着编写一个子过程拦截文本框的右键消息(必须放在一般模块中):Public Function newTxtFunc(ByVal hWnd as long,ByVal Msg as long,ByVal wParam as _ long ,ByVal lParam as long)as longIf Msg=WM_RBUTTONDOWN thenelse newTxtFunc=CallWindowProc(hWnd,Msg,wParam,lParam) end if 接着你在窗口的 Load 事件中添加以下代码:SetWindowLong Text.hWnd,-4,Addressof newTxtFunc 怎样就可以实现屏蔽文本框的右键菜单了。注:因为文本框不同与窗口,所以不需要将它的窗口程序还原。(还不给分?太不近人情了吧:(((
end if
马上结帖!!!!!!!
Public OldWinProc 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 SubClass_WndMessage(ByVal hwnd As _
OLE_HANDLE, ByVal Msg As OLE_HANDLE, ByVal wParam As OLE_HANDLE, _
ByVal lParam As Long) As Long
If Msg <> WM_CONTEXTMENU Then
SubClass_WndMessage = CallWindowProc(OldWinProc, _
hwnd, Msg, wParam, lParam)
' 如果消息不是WM_CONTEXTMENU,就调用系统的窗口处理函数
Else
SubClass_WndMessage = True
End If
End Function
'窗体中,放一TextBox
Option ExplicitPrivate Sub Form_Load()
OldWinProc = GetWindowLong(Text1.hwnd, GWL_WNDPROC)
SetWindowLong Text1.hwnd, GWL_WNDPROC, AddressOf SubClass_WndMessageEnd Sub
newTxtFunc=CallWindowProc(hWnd,Msg,wParam,lParam)
end if
接着你在窗口的 Load 事件中添加以下代码:SetWindowLong Text.hWnd,-4,Addressof newTxtFunc
怎样就可以实现屏蔽文本框的右键菜单了。注:因为文本框不同与窗口,所以不需要将它的窗口程序还原。(还不给分?太不近人情了吧:(((
oldTxtFunc=getwindowlong(text.hwnd,-4) 将此语句放在窗体 Load 事件中,即在SetWindowLong Text.hWnd,-4,Addressof newTxtFunc 语句的前面然后把 newTxtFunc 过程中的 newTxtFunc=CallWindowProc(hWnd,Msg,wParam,lParam) 更改为:newTxtFunc=CallWindowProc(oldTxtFunc,hWnd,Msg,wParam,lParam)其他没什么问题了。
可以加我QQ:26885256 吗?向你们请教一下问题
给分了!!!!!!!!!!!!!