【问】如何回传结构数据到CallNextHookEx?

VBAHZ 2017-07-21 05:00:44
用WH_KEYBOARD_LL钩子,在回调中得到结构:
Dim P As KBDLLHOOKSTRUCT

'lParam 指向KBDLLHOOKSTRUCT结构的指针
Call CopyMemory(P, ByVal lParam, LenB(P))

请问,我修改了P的内容后,如何再回传给下一个钩子

Call CallNextHookEx(nCode,wParam,lParam(P??)

...全文
4762 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2017-07-26
  • 打赏
  • 举报
回复
引用 4 楼 VBAHZ 的回复:
. . . . . . . 是不是也因为无法代码注入,从而无法把修改后的数据传给下一个钩子?
先别说“跨进程”的,即使对“本进程”也没有效果啊! 你可以试试: 自己画个Text控件,程序运行、安装钩子, 然后在Text中输入字符,可以看到: 即使在钩子过程中更改了按键信息,也并没有起到“改”的作用。 我也看了“响应秩序”: 钩子的响应,确实在Text的控件事件之前!
舉杯邀明月 2017-07-26
  • 打赏
  • 举报
回复
没想明白为什么会没有效果。 先前试了一下,我不仅更改了vkCode,并且还把键盘扫描码也“同步更正”了的,也没效果。 (我不是copymemory后再改数据,而是直接改lParam指向的数据区) 难道系统在后面发送键盘消息时,并不以“钩子数据”为准,而是以原始键盘数据为准? (传递钩子消息的数据只是一个“副本”,给钩子处理完之后直接丢弃?) 如果是这样,那“底层HOOK”又有多大的实际意义呢………… 难道就是为了方便“木马”搞键盘记录吗!
赵4老师 2017-07-26
  • 打赏
  • 举报
回复
汇编指令面前,了无秘密。 http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
VBAHZ 2017-07-26
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
坊间传闻,SetWindowsHookEx必须放在DLL中。
有某些全局钩子可以不依赖于任何DLL而正常工作的。这些钩子包括,WH_JOURNALPLAYBACK,WH_JOURNALRECORD,WH_KEYBOARD_LL,WH_MOUSE_LL。为什么这些钩子可以不依赖于DLL而正常工作呢?我们可以从MSDN中得到答案,MSDN中对于这四种钩子都这样的描述“This hook is called in the context of the thread that installed it.”,翻译成中文意思是钩子函数的调用是在安装钩子的线程上下文中进行的,说得更明白些,意思就是这些钩子是在哪个线程当中安装的,其钩子函数就在哪个线程中执行。所以使用这四种钩子是达不到代码注入的效果的,当然也就可以不依赖于任何DLL了。MSDN中只对个别钩子指出了必须还是没有必要使用DLL。 是不是也因为无法代码注入,从而无法把修改后的数据传给下一个钩子?
VBAHZ 2017-07-26
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
汇编指令面前,了无秘密。 http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
不明觉厉好东西啊,虽然现在不懂,但收藏先 :)
VBAHZ 2017-07-26
  • 打赏
  • 举报
回复
引用 7 楼 Chen8013 的回复:
[quote=引用 4 楼 VBAHZ 的回复:] . . . . . . . 是不是也因为无法代码注入,从而无法把修改后的数据传给下一个钩子?
先别说“跨进程”的,即使对“本进程”也没有效果啊! 你可以试试: 自己画个Text控件,程序运行、安装钩子, 然后在Text中输入字符,可以看到: 即使在钩子过程中更改了按键信息,也并没有起到“改”的作用。 我也看了“响应秩序”: 钩子的响应,确实在Text的控件事件之前! [/quote] 非常同意,因为试过,就是这种情况,连自己的进程都没法改, 所以疑问啊.... 网上搜了半天,这么多年来,难道没任何人发现这个问题吗?
VBAHZ 2017-07-26
  • 打赏
  • 举报
回复
引用 6 楼 Chen8013 的回复:
没想明白为什么会没有效果。 先前试了一下,我不仅更改了vkCode,并且还把键盘扫描码也“同步更正”了的,也没效果。 (我不是copymemory后再改数据,而是直接改lParam指向的数据区) 难道系统在后面发送键盘消息时,并不以“钩子数据”为准,而是以原始键盘数据为准? (传递钩子消息的数据只是一个“副本”,给钩子处理完之后直接丢弃?) 如果是这样,那“底层HOOK”又有多大的实际意义呢………… 难道就是为了方便“木马”搞键盘记录吗!
老大仔细啊,说实话,俺还真没想到把扫描码也同步更正,大意了大意了, 只是试过,用全局变量的方式传数据,结果------当然-------没戏:(
赵4老师 2017-07-25
  • 打赏
  • 举报
回复
坊间传闻,SetWindowsHookEx必须放在DLL中。
VBAHZ 2017-07-21
  • 打赏
  • 举报
回复
但没反应啊!
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long

启动
mHook=SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf HookKbProc, App.hInstance, 0)

回调函数,收A,转发为B,
Public Function HookKbProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim uP As KBDLLHOOKSTRUCT
If nCode < 0 Or nCode > 0 Then
ExLine:
HookKbProc = CallNextHookEx(0, nCode, wParam, lParam) '将消息传给下一个钩子 '本函数返回值,由下一钩子决定
Exit Function
End If
Call CopyMemory(uP, ByVal lParam, LenB(uP))
With uP
If .vkCode = vbKeyA Then
.vkCode = vbKeyB
Debug.Print "A>B"
End If
End With
HookKbProc = CallNextHookEx(0, nCode, wParam, ByVal VarPtr(uP))
End Function
舉杯邀明月 2017-07-21
  • 打赏
  • 举报
回复
既然是“指针”,传:byval Varptr(P)就行了。

1,486

社区成员

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

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