| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2746 人关注过本帖, 1 人收藏
标题:SetWindowsHookEx函数中的lpfn什么意思
只看楼主 加入收藏
幸运之星
Rank: 4
来 自:吉林
等 级:业余侠客
帖 子:275
专家分:239
注 册:2009-6-5
结帖率:100%
收藏(1)
 问题点数:0 回复次数:4 
SetWindowsHookEx函数中的lpfn什么意思
在网上找了很久也没有说明也许我的智商低下理解不上去啊 找了很多资料我也没明白 资料上一般都是 一带而过
如果咱们论坛有明白的人麻烦 帮帮小弟我

还有如下问题 鼠标回放的代码如下 作者我忘了 代码如下
在Form1中得画三个按钮控件 Caption 分别为 记录  停止  回放
Private Sub Command1_Click()
EventLog = 0
hHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf a, App.hInstance, 0)
Command2.Enabled = True
Command1.Enabled = False
End Sub

Private Sub Command2_Click()
UnhookWindowsHookEx hHook
hHook = 0
Command1.Enabled = True
Command2.Enabled = False
Command3.Enabled = True
End Sub

Private Sub Command3_Click()
PlayLog = 0
hPlay = SetWindowsHookEx(WH_JOURNALPLAYBACK, AddressOf PlaybackProc, _
App.hInstance, 0)
Command3.Enabled = False
End Sub

Private Sub Form_Load()
Command2.Enabled = False
Command3.Enabled = False
End Sub




模块中的代码

Public Type EVENTMSG
message As Long
paramL As Long
paramH As Long
time As Long
hwnd As Long
End Type

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 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 Sub CopyMemorya Lib "kernel32" Alias "RtlMoveMemory" (ByVal Dest As Long, Source As EVENTMSG, ByVal Length As Long)
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Dest As EVENTMSG, ByVal Source As Long, ByVal Length As Long)
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long

Public Const WH_JOURNALPLAYBACK = 1
Public Const WH_JOURNALRECORD = 0
Public Const HC_SYSMODALOFF = 5
Public Const HC_SYSMODALON = 4
Public Const HC_SKIP = 2
Public Const HC_GETNEXT = 1
Public Const HC_ACTION = 0

Public EventArr(1000) As EVENTMSG
Public EventLog As Long
Public PlayLog As Long
Public hHook As Long
Public hPlay As Long
Public recOK As Long
Public canPlay As Long
Public bDelay As Boolean
Public Function a(ByVal iCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim Result As Long
recOK = 1
Result = 0
If iCode < 0 Then 'iCode小于0必须直接调用下一个消息钩子函数

Result = CallNextHookEx(hHook, iCode, wParam, lParam)

ElseIf iCode = HC_SYSMODALON Then '不允许纪录

recOK = 0

ElseIf iCode = HC_SYSMODALOFF Then '允许纪录

recOK = 1

ElseIf ((recOK > 0) And (iCode = HC_ACTION)) Then
'将消息纪录在纪录队列中

CopyMemory EventArr(EventLog), lParam, Len(EventArr(EventLog))
EventLog = EventLog + 1
If EventLog >= 1000 Then
'当纪录大于1000后释放消息钩子
UnhookWindowsHookEx hHook
End If
End If
a = Result
End Function

Public Function PlaybackProc(ByVal iCode As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
Dim Result As Long

canPlay = 1
Result = 0

If iCode < 0 Then 'iCode小于0必须直接调用下一个消息钩子函数
Result = CallNextHookEx(hPlay, iCode, wParam, lParam)
ElseIf iCode = HC_SYSMODALON Then '不允许回放
canPlay = 0
ElseIf iCode = HC_SYSMODALOFF Then '允许回放
canPlay = 1
ElseIf ((canPlay = 1) And (iCode = HC_GETNEXT)) Then
If bDelay Then
bDelay = False
Result = 50
End If
'从纪录队列中取出消息并赋予lParam指针指向的EVENTMSG区域
CopyMemorya lParam, EventArr(PlayLog), Len(EventArr(EventLog))
ElseIf ((canPlay = 1) And (iCode = HC_SKIP)) Then
bDelay = True
PlayLog = PlayLog + 1
End If

If PlayLog >= EventLog Then
UnhookWindowsHookEx hPlay
End If
PlaybackProc = Result
End Function

我按运行程序的思路往下 理解 可是发现
Command1_Click()中
hHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf a, App.hInstance, 0)

hHook 得通过 SetWindowsHookEx得到 但是 SetWindowsHookEx中不需调用 模块中的a()函数啊
而a()函数中的又会用到hHook那程序不是死循环了吗 但是程序能正常运行 我知道是我理解错了








[ 本帖最后由 幸运之星 于 2009-11-7 17:17 编辑 ]
搜索更多相关主题的帖子: 函数 lpfn 
2009-11-07 17:11
幸运之星
Rank: 4
来 自:吉林
等 级:业余侠客
帖 子:275
专家分:239
注 册:2009-6-5
收藏
得分:0 
还有 SetWindowsHookEx中的第三个参数  我在网上找了很久也没有说明
关于 SetWindowsHookEx中的第三个参数(lpfn)我有如下理解在网上找的大家就不要再复制粘贴了


1.
HOOKPROC lpfn, // 钩子子程的地址指针。如果dwThreadId参数为0
  // 或是一个由别的进程创建的线程的标识,
  // lpfn必须指向DLL中的钩子子程。
  // 除此以外,lpfn可以指向当前进程的一段钩子子程代码。
  // 钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。
2.
HOOKPROC lpfn,   //钩子过程的指针 ,也即拦截到指定系统消息后的预处理过程,须定义在DLL中,
3.
HOOKPROC  lpfn,      // 钩子函数地址
4.
 HOOKPROC lpfn, // 地址钩子程序
5.
点钩程序。如果DWTHREADID参数是零或指定的标识符一个线程所造成的不同的过程中, LPFN参数必须指向一个钩子程序在一个动态链接库( DLL ) 。否则, LPFN可以指向一个钩子程序,在相关的代码与现行的进程。
6.
lpfn值为钩子子程序的地址指针。如果dwThreadId参数为0或是一个由别的进程创建的线程的标识,lpfn必须指向DLL中的钩子子程。除此以外,lpfn可以指向当前进程的一段钩子子程代码。
7.
lpfn值为钩子子程序的地址指针。如果dwThreadId参数为0或是一个由别的进程创建的线程的标识,lpfn必须指向DLL中的钩子子程
8.
HOOKPROC lpfn, // 钩子函数的入口地址

如果有人能帮我简单的例子或思路理解也可以
还有为什么SetWindowsHookEx函数要用到 钩子子程序的地址指针即(lpfn



[ 本帖最后由 幸运之星 于 2009-11-7 17:18 编辑 ]
2009-11-07 17:11
幸运之星
Rank: 4
来 自:吉林
等 级:业余侠客
帖 子:275
专家分:239
注 册:2009-6-5
收藏
得分:0 
新建文件夹 (5).rar (6.63 KB)

这是鼠标回放的代码和程序
2009-11-07 17:15
幸运之星
Rank: 4
来 自:吉林
等 级:业余侠客
帖 子:275
专家分:239
注 册:2009-6-5
收藏
得分:0 
我以知道答案了  可能是编了一天程序 脑袋不好使了先头和老婆去吃饭回来
重新查找竟然找到答案了 呵呵

呵呵 用我简单的理解就是 把idHook类型的数据勾住 呵呵
以下引自Bu_zai..想念永远的45756的博客
****************************************************************************************************************************
hook的ID赋予WH_KEYBOARD这个常量,同时把这里的函数名给lpfn就可以让这个钩子函数,变成键盘钩子函数了
******************************************************************************************************************************
自己问自己答郁闷啊 呵呵

版主可以把这个问题留给其他参考或是删除 呵呵


虽然我没有得到答案但是当我无助或是空虚的时候我就会回到这个大家庭看看或是帮助其他人

我学校有很多病毒导致浏览网页都很不爽 呵呵
学校的大爷们谁也不管 连校长的留言板都是做面子根本不能把留言发上去
呵呵 还不让人随便发点感慨吗
2009-11-07 18:53
bczgvip
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:66
帖 子:1310
专家分:5312
注 册:2009-2-26
收藏
得分:0 
呵呵,可以到 MSDN 上看看函数说明。
2009-11-08 21:13
快速回复:SetWindowsHookEx函数中的lpfn什么意思
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042677 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved