屏蔽鼠标按键

kwxx 2001-07-19 08:17:23
在一个TEXT控件中,如何禁用鼠标的左右键?要左右键全部失效,左键不能移动光标,右键不能弹出菜单。如何办?
我可以通过MOUSEDOWN事件截获鼠标的按键消息,但没法屏蔽。如果是屏蔽键盘按键,那么把KEYASCII或KEYCODE设置为0也就可以了,但若把BUTTON设置为0却没用。如何屏蔽???
...全文
293 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
kwxx 2001-07-23
  • 打赏
  • 举报
回复
除了Frank_Xu()和灌水的人以外,其它人都给分.
因为,Frank_Xu()必须到另一个帖子去拿分
haha
Frank_Xu 2001-07-23
  • 打赏
  • 举报
回复
好象是WM_LBUTTONDBLCLK
Frank_Xu 2001-07-22
  • 打赏
  • 举报
回复
我重新測試並通過
完全代碼如下:
*.BAS

Option Explicit

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 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 Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_MOUSEMOVE = &H200
Public Const WM_RBUTTONDBLCLK = &H206
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Public Const GWL_WNDPROC = (-4)
Public prevWndProc As Long


Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case Msg
Case WM_LBUTTONDOWN
Case WM_LBUTTONUP
Case WM_MOUSEMOVE
Case WM_RBUTTONDOWN
Case WM_RBUTTONUP
Case WM_RBUTTONDBLCLK
Case Else
WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
End Select
End Function


*.FRM
//Text1是你的TextBox控件名
Private Sub Form_Load()
prevWndProc = GetWindowLong(Text1.hWnd, GWL_WNDPROC)
Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, AddressOf WndProc)
End Sub

如果還有問題就是你vb本身的問題.
上面要加上AddressOf,
SetWindowLong(txt.hwnd,GWL_WNDPROC,WndProc)是VC的寫法

kwxx 2001-07-22
  • 打赏
  • 举报
回复
to Frank_Xu()
为什么我运行那段代码总是出错,提示参数不可选???
CALL SetWindowLong(txt.hwnd,GWL_WNDPROC,WndProc)
就是这句,“WNDPROC”被加蓝,说“WNDPROC”参数不可选!怎么回事?
望解答!
请把你能运行的工程发给我,最好把工程的EXE也一起带上。
mywangtao@yeah.net
kwxx 2001-07-22
  • 打赏
  • 举报
回复
up
kwxx 2001-07-22
  • 打赏
  • 举报
回复
Frank_Xu()
谢谢了,通过,不知我那里出了毛病。
最后问一句,当鼠标双击是会选中TEXT中的内容,这又用哪个值?
bobbysz 2001-07-21
  • 打赏
  • 举报
回复
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_MOUSEMOVE = &H200
Public Const GWL_WNDPROC = (-4)
把这些补再上面代码中*.bas的声明段中
Frank_Xu 2001-07-21
  • 打赏
  • 举报
回复
*.bas
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 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 prevWndProc As Long
自已用API View查一查WM_LBUTTONDOWN,GWL_WNDPROC等的十六進制值.要用Public聲明並放在模塊文件中.

Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case Msg
Case WM_LBUTTONDOWN
Case WM_LBUTTONUP
Case WM_MOUSEMOVE
Case Else
WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
End Select
End Function


*.frm中
Private Sub Form_Load()
prevWndProc=GetWindowLong(txt.hwnd,GWL_WNDPROC)
SetWindowLong(txt.hwnd,GWL_WNDPROC,WndProc)
你自已的代碼....
End Sub
Frank_Xu 2001-07-21
  • 打赏
  • 举报
回复
你將WndPorc函數放到模塊中,把我的代碼加到窗體初始化Form_load()中.
有空最好了解一下VC.呵呵~~
jlzwj 2001-07-21
  • 打赏
  • 举报
回复
以下的代码,我试了,挺灵的。

*.bas
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 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 prevWndProc As Long
自已用API View查一查WM_LBUTTONDOWN,GWL_WNDPROC等的十六進制值.要用Public聲明並放在模塊文件中.

Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case Msg
Case WM_LBUTTONDOWN
Case WM_LBUTTONUP
Case WM_MOUSEMOVE
Case Else
WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
End Select
End Function


*.frm中
Private Sub Form_Load()
prevWndProc=GetWindowLong(txt.hwnd,GWL_WNDPROC)
SetWindowLong(txt.hwnd,GWL_WNDPROC,WndProc)
你自已的代碼....
End Sub
jlzwj 2001-07-21
  • 打赏
  • 举报
回复
怎么搞的,打开你的问题时,还真的让我的鼠标屏蔽了,就这么简单。
Leemaasn 2001-07-21
  • 打赏
  • 举报
回复
我也up!
bdzwc 2001-07-21
  • 打赏
  • 举报
回复
SUBCLASSING,拦截MOUSE消息
kwxx 2001-07-21
  • 打赏
  • 举报
回复
up
kwxx 2001-07-21
  • 打赏
  • 举报
回复
up
kwxx 2001-07-21
  • 打赏
  • 举报
回复
怎么做呢?对此我一无所知
yicn 2001-07-21
  • 打赏
  • 举报
回复
用系统API不就可以了吗?很简单的。
kwxx 2001-07-21
  • 打赏
  • 举报
回复
我以前也是这个错误,WndProc参数不可选,所以我还以为我调用有什么错误。
kwxx 2001-07-21
  • 打赏
  • 举报
回复
为什么执行Call SetWindowLong(txt.hWnd, GWL_WNDPROC, AddressOf WndProc) 时总是说“WNDPROC”参数不可选?
kyuwong 2001-07-21
  • 打赏
  • 举报
回复
SetWindowLong(txt.hwnd,GWL_WNDPROC,WndProc)
应该改为:
Call SetWindowLong(txt.hWnd, GWL_WNDPROC, AddressOf WndProc)
加载更多回复(12)

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧