VB怎么用HOOK函数拦截按钮的click事件
发布网友
发布时间:2023-04-24 02:55
我来回答
共2个回答
热心网友
时间:2023-10-10 23:34
window系统的程序都是消息驱动机制,意思就是说靠消息来响应事件,当我们点击commandbutton时 系统会获取这个消息,然后会把这个 鼠标 或者键盘按键消息发送给 commandbutton 处理消息的一个函数,他人称之为 窗口过程,系统吧消息发送给 该 commandbutton 的窗口过程,该窗口过程 就会按消息 不同种类执行相应的代码,如下代码 是拦截 鼠标和键盘的按键消息,从而 不让窗口过程 调用 click 方法。
’-------------------------------------窗口代码
Private Sub Command1_Click()
MsgBox 1
End Sub
Private Sub Form_Load()
OldPrc = SetWindowLong(Command1.hwnd, -4, AddressOf CommandProc)
End Sub
‘-------------------------------------模块代码
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
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public OldPrc As Long
Public Function CommandProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Debug.Print Hex(Msg)
If Msg = &H201 Or Msg = &H100 Then Exit Function
CommandProc = CallWindowProc(OldPrc, hwnd, Msg, wParam, lParam)
End Function
'特别说明下,执行 Click 方法的时候是Form窗口的窗口过程调用Click方法,并非是 Command 按钮的窗口过程,系统首先是把消息 发送给 Command 按钮的窗口过程,然后Command 按钮的窗口过程 又把消息 转发给 Form窗口的窗口过程,然后 Form窗口的窗口过程 按消息种类 执行
我们写的 Command的一些方法,
详细内容请参考 MSDN 或者 windows核心编程 的windows消息机制
热心网友
时间:2023-10-10 23:35
为当前线程设一个键盘hook,在过程中判断句柄,如果是按钮,就拦截WM_LBUTTONDOWN消息