杭州津桥留学:VB 中,如何对某一个控件屏蔽右键?

来源:百度文库 编辑:神马品牌网 时间:2024/05/06 08:22:48
麻烦用text1给我举个例子,但是我想要一个通用点的方法,对任何控件都管用,而不是只能在text1上管用,换成command1就不管用了。。

如何使Mouse的右键无效(Mouse Hook)

让Mouse的右键无效,其实也就是拦截WM_RBUTTONDOWN/WM_RBUTTONUP,但是,如果只针
对某个Window/有hWnd的控制项,那便是使用SubClass来做,如果针对的是整个Process
那麽,用Mouse Hook比较好,然而这只针对单一个Process,而如何让所有的Process都
如此,那得使用Remote的Mouse Hook,但这是要放在.Dll之中,而单纯用VB来做我没有
试出来。

'以下在Form
Private Sub Form_Load()
Call EnableHook
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Debug.Print X; Y
End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Debug.Print X; Y
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call FreeHook
End Sub

'以下在.Bas
Public Const WH_MOUSE = 7
Public Const WM_RBUTTONDOWN = &H204
Public Const HC_ACTION = 0
Public Const WM_RBUTTONUP = &H205

Declare Function SetWindowsHookEx Lib "user32" Alias _
"SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, _
ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _
ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" _
(lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long)
Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
Public theForm As Form
Public hHook As Long ' handle of Hook Procedure
Sub EnableHook()
If hHook = 0 Then
hHook = SetWindowsHookEx(WH_MOUSE, AddressOf MouseHookProc, App.hInstance, 0)
End If
End Sub
Sub FreeHook()
Dim ret As Long
If hHook <> 0 Then
ret = UnhookWindowsHookEx(hHook)
hHook = 0
End If
End Sub
Function MouseHookProc(ByVal code As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
If code < 0 Then
MouseHookProc = CallNextHookEx(hHook, code, wParam, lParam)
Exit Function
End If
If wParam = WM_RBUTTONDOWN Or wParam = WM_RBUTTONUP Then
MouseHookProc = 1 '表示不处理这个讯息
Exit Function
End If
MouseHookProc = 0 '表示要处理这个讯息
Call CallNextHookEx(hHook, code, wParam, lParam)
End Function

伤脑筋..5分的代价不值得呵呵

路过.