VB 窗体中的控件如何捕捉鼠标中键单击动作?

nsd76zw 2012-09-05 04:02:57


代码如下:
窗体:
Option Explicit

Private Sub Form_Load()
Call Hook(Me.hwnd)
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call UnHook(Me.hwnd)
End Sub
模块:
Option Explicit

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 Long
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
Private Const GWL_WNDPROC = (-4)
'Private Const WM_MOUSEWHEEL = &H20A
Private Const HC_ACTION = 0
Private Const WH_MOUSE_LL As Long = 14
Private Const WM_MOUSEMOVE = &H200
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205
Private Const WM_RBUTTONDBLCLK = &H206
Private Const WM_MBUTTONDOWN = &H207
Private Const WM_MBUTTONUP = &H208
Private Const WM_MBUTTONDBLCLK = &H209
Private Const WM_MOUSEACTIVATE = &H21
Private Const WM_MOUSEFIRST = &H200
Private Const WM_MOUSELAST = &H209
Private Const WM_MOUSEWHEEL = &H20A '以上是鼠标的各个值
Private lpWndProc As Long

Public Sub Hook(hwnd As Long)
lpWndProc = GetWindowLong(hwnd, GWL_WNDPROC) '获得原始窗口函数句柄
SetWindowLong hwnd, GWL_WNDPROC, AddressOf mWindowProc '装载WM_MOUSEWHEEL消息的处理过程到窗口函数
End Sub

Public Sub UnHook(hwnd As Long)
SetWindowLong hwnd, GWL_WNDPROC, lpWndProc '御掉Hook,还原原始窗口函数
End Sub

Private Function mWindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'处理WM_MOUSEWHEEL消息的窗口函数
If uMsg = WM_MBUTTONDOWN Then
Form1.Text1.Text = "WM_MBUTTONDOWN"
End If
mWindowProc = CallWindowProc(lpWndProc, hwnd, uMsg, wParam, lParam)
End Function

Private Function HIWORD(MsgParam As Long) As Integer
'取出32位值的高16位
HIWORD = (MsgParam And &HFFFF0000) \ &H10000
End Function
-------------------------------------------------------------------------------
我想实现的功能是在窗体范围内只要点击鼠标中键,文本框文字就显示“WM_MBUTTONDOWN”,但是上面的代码却没有完全实现,只能在窗体上点击才有效果,在窗体别的控件内点击就没有效果,请问问题出在哪儿,VB新手,求指导!谢谢!
...全文
406 4 打赏 收藏 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
startbin 2012-09-07
  • 打赏
  • 举报
回复
挂个鼠标钩子就行了 不用子类化
nsd76zw 2012-09-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

窗口中每个控件都加一个HOOK进去
每个句柄都HOOK一下
10个控件就用10个,同时这个也要存下来lpWndProc ,hwnd,这2个参数也存10个变量,到时要一一UNHOOK
Public Sub Hook(hwnd As Long)
lpWndProc = GetWindowLong(hwnd, GWL_WNDPROC) '获得原始窗口函数句柄
SetWindowLon……
[/Quote]
我在窗体里的控件没有hwnd这个属性,那我怎么获得它的句柄呢,怎么hook这个控件?
nsd76zw 2012-09-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

窗口中每个控件都加一个HOOK进去
每个句柄都HOOK一下
10个控件就用10个,同时这个也要存下来lpWndProc ,hwnd,这2个参数也存10个变量,到时要一一UNHOOK
Public Sub Hook(hwnd As Long)
lpWndProc = GetWindowLong(hwnd, GWL_WNDPROC) '获得原始窗口函数句柄
SetWindowLon……
[/Quote]
对了忘了说了,我添加的控件是别的开发库提供的控件,控件属性没有hwnd那个属性,那我怎么给这样的控件添加hook呢。。
  • 打赏
  • 举报
回复
窗口中每个控件都加一个HOOK进去
每个句柄都HOOK一下
10个控件就用10个,同时这个也要存下来lpWndProc ,hwnd,这2个参数也存10个变量,到时要一一UNHOOK
Public Sub Hook(hwnd As Long)
lpWndProc = GetWindowLong(hwnd, GWL_WNDPROC) '获得原始窗口函数句柄
SetWindowLong hwnd, GWL_WNDPROC, AddressOf mWindowProc '装载WM_MOUSEWHEEL消息的处理过程到窗口函数
End Sub

1,453

社区成员

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

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