学钩子试写的程序,但一点都不懂
为了学习钩子的内容,在窗体上做了两个按钮
按纽1 是每按一下会在其显示上自动加1
而按纽2是根据按纽1的资料下勾子
这样写象没有勾住,当打开的文件夹最小化及关闭时发生了事件,而按纽点击或加一却没有动作
请各位大牛指点指点!
谢谢
而本贴的实际应用将是在如下贴子的一个想法,也请一并去看看?
http://topic.csdn.net/u/20111111/22/d3c96ef8-3f85-4c8d-bd48-f417e26727f4.html?seed=1603349889&r=76466799#r_76466799
无限感激!
'这是在模块里,抄网上的内容的
Public m_hDllKbdHook As Long '全局键盘钩子变量
Private Const HC_ACTION As Long = 0 'wParam and lParam parameters
'contain information about a keyboard message
Private Const VK_F1 = &H70
Public Type KeyboardBytes
kbByte(0 To 255) As Byte
End Type
Private Type KBDLLHOOKSTRUCT
vkCode As Long 'a virtual-key code in the range 1 to 254
scanCode As Long 'hardware scan code for the key
flags As Long 'specifies the extended-key flag,
'event-injected flag, context code,
'and transition-state flag
time As Long 'time stamp for this message
dwExtraInfo As Long 'extra info associated with the message
End Type
Public Declare Function GetWindowThreadProcessId Lib "user32" _
(ByVal hwnd As Long, lpdwProcessId As Long) As Long
'安装勾子
Public 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
Public Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
Public Declare Function CallNextHookEx Lib "user32" _
(ByVal hHook As Long, _
ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" _
(pDest As Any, _
pSource As Any, _
ByVal cb As Long)
'idHook代表是何种Hook,有以下几种
Public Const WH_KEYBOARD_LL As Long = 13 'enables monitoring of keyboard
'input events about to be posted
'in a thread input queue
Public Const WH_CALLWNDPROC = 4
Public Const WH_CALLWNDPROCRET = 12
Public Const WH_CBT = 5
Public Const WH_DEBUG = 9
Public Const WH_FOREGROUNDIDLE = 11
Public Const WH_GETMESSAGE = 3
Public Const WH_HARDWARE = 8
Public Const WH_JOURNALPLAYBACK = 1
Public Const WH_JOURNALRECORD = 0
Public Const WH_KEYBOARD = 2
Public Const WH_MOUSE = 7
Public Const WH_MSGFILTER = (-1)
Public Const WH_SHELL = 10
Public Const WH_SYSMSGFILTER = 6
Dim ad
Public Function controlsProc(ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Static kbdllhs As KBDLLHOOKSTRUCT '这只中抄网上的不知何解
If nCode = HC_ACTION Then '拦消息的特征码是什么?代表一个消息正在被发送
If wParam > 0 Then '据说这是有消息传递了,表示勾住了?
'这是的操作就是想知道按纽1勾住了后
'每按一次它会加一,它最后显示的那个结果能得出来
'不知道如何写下去了
End If
End If
'全部不拦截后才会有下一下勾子,拦后会自动有下一个?
controlsProc = CallNextHookEx(m_hDllKbdHook, nCode, wParam, lParam)
End Function
'下面是在窗体上写的内容
Private Sub Command1_Click()
Command1.Caption = Val(Command1.Caption) + 1
End Sub
Private Sub Command2_Click()
Dim MyHwnd& '指定的句柄
Dim MyThreadId&, MyProcessId& '由句柄得到线程及进程
MyHwnd = Command1.hwnd '按纽1的句柄
MyThreadId = GetWindowThreadProcessId(MyHwnd, MyProcessId)
'装载钩子
'勾住按纽1,用以得到信息
m_hDllKbdHook = SetWindowsHookEx(WH_GETMESSAGE, AddressOf controlsProc, App.hInstance, MyThreadId)
'本意是想用钩子查看按钮1所发生的事件
'所以第一个参数用了想得到信息
'第三个参数不知为什么,只抄了网上的写法
'第四个参数是用了按钮1 的线程,希望只钩按纽1 的消息
If m_hDllKbdHook = 0 Then
MsgBox "Failed to install low-level keyboard hook."
End If
End Sub
'卸载钩子
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Call UnloadHook
End Sub
Private Sub Form_Terminate()
Call UnloadHook
End Sub
Sub UnloadHook()
If m_hDllKbdHook <> 0 Then
Call UnhookWindowsHookEx(m_hDllKbdHook)
End If
End Sub