学钩子试写的程序,但一点都不懂

sunsoncheng 2011-11-13 10:12:36
为了学习钩子的内容,在窗体上做了两个按钮
按纽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
...全文
56 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunsoncheng 2011-11-18
  • 打赏
  • 举报
回复
这个看来是学不会了的
sunsoncheng 2011-11-13
  • 打赏
  • 举报
回复
那些东东我都大概看过

可能人笨,看不懂

不知道怎么转化过来

版主能就本例讲下如何做吗?

现在的要求不是键盘与鼠标,而是按纽产生了动作后,从他自身产生加一时的变化的消息


还有就是那几个参数这样选到底行与不行?

1,486

社区成员

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

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