要如何才能观察到 SetWindowsHookEx 的回传值, 又不会死机

bobogg 2015-06-25 06:10:52
在网上找了 键盘拦截的范例

它使用了 SetWindowsHookEx

并不是想拦截键盘

只是想观察 SetWindowsHookEx 的回传值

可是 vb ide 一执行后. 确实是可以看到 callback 极快的不停回传 nCode , wParam , lParam

确实是可以看到 nCode , wParam , lParam 的回传值

但是问题是 整个 windows 会立刻动弹不得 , 只能重新开机

把它改编译成 exe 档, 但是执行exe 档, 整个 windows 还是一样会动弹不得, 还是得重新开机

不知道 SetWindowsHookEx 要怎么写才能不会死机

范例撷取如下



Public Function SetHook() As Boolean
If hJournalHook = 0 Then
hJournalHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf JournalRecordProc, App.hInstance, 0)
End If
SetHook = True
End Function

Public Function JournalRecordProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If nCode Then
Debug.Print nCode, wParam, lParam, "A90"
End If
If nCode < 0 Then
JournalRecordProc = CallNextHookEx(hJournalHook, nCode, wParam, lParam)
Exit Function
End If
'ResolvePointer(SHptr).FireEvent nCode, wParam, lParam
Call CallNextHookEx(hJournalHook, nCode, wParam, lParam)
End Function



//=============================

有试过 SetWindowsLong 的拦截讯息, SetWindowsLong 完全不会发生死机啊







...全文
324 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2015-06-29
  • 打赏
  • 举报
回复
不能直接去掉,下面这句必须被调用。你Hook的规则先搞明白再做啊。
JournalRecordProc = CallNextHookEx(hJournalHook, nCode, wParam, lParam)

bobogg 2015-06-29
  • 打赏
  • 举报
回复
答案揭晓 (1) Call CallNextHookEx(hJournalHook, nCode, wParam, lParam) (2) JournalRecordProc = CallNextHookEx(hJournalHook, nCode, wParam, lParam) 用 (1) or (2) 都会死机 慢慢试出了死机的原因了 SetWindowsHookEx(12, AddressOf HkProc, App.hInstance, 0) --> 会死机 SetWindowsHookEx(12, AddressOf HkProc, App.hInstance, App.ThreadID) --> 不会死机 '=========== 心得 SetWindowsHookEx( ) CallBack 速度太快太快了 挂上它, 性能肯定下降
bobogg 2015-06-29
  • 打赏
  • 举报
回复
引用 4 楼 Tiger_Zhao 的回复:
不能直接去掉,下面这句必须被调用。你Hook的规则先搞明白再做啊。
JournalRecordProc = CallNextHookEx(hJournalHook, nCode, wParam, lParam)
你的意思是我少了 JournalRecordProc = 这句是吗 我最早是写成 Call CallNextHookEx(hJournalHook, nCode, wParam, lParam) --> 那固范例是这养写的 我试试看在回报给您
bobogg 2015-06-26
  • 打赏
  • 举报
回复
引用 1 楼 Tiger_Zhao 的回复:
你最后一句 Call CallNextHookEx 把返回值吞掉了啊。 许多需要返回值的 CallWndProc 调用不正常了啊。
感谢耶 code 来自 http://zhidao.baidu.com/question/54502685.html 下午电脑做完事后, 把 CallNextHookEx 杀掉, 再实验看看 再回报结果给您
Tiger_Zhao 2015-06-26
  • 打赏
  • 举报
回复
你最后一句 Call CallNextHookEx 把返回值吞掉了啊。
许多需要返回值的 CallWndProc 调用不正常了啊。
bobogg 2015-06-26
  • 打赏
  • 举报
回复
引用 1 楼 Tiger_Zhao 的回复:
你最后一句 Call CallNextHookEx 把返回值吞掉了啊。
许多需要返回值的 CallWndProc 调用不正常了啊。


实验结果揭晓
还是没成功
差别在把 Call CallNextHookEx 杀掉后
程序还是异常, WinXp 虽会卡住, 但至少有办法叫出任务管理员, 藉由登出来解除危机

以下是 Call CallNextHookEx 的功能图
http://www.kab-studio.biz/Programing/Codian/DLL_Hook_SClass/0702.gif
根据 google 查到 CallNextHookEx 就是要 将钩子信息 传递到当前钩子链中的下一个子程
并不是会吞掉信息


如果使用 SetWindowsLong 拦截讯息, 下面一样会有一句 CallWindowProc 来往下继续传递消息
和 Call CallNextHookEx 目的是要往下继续传消息是一样的

1,486

社区成员

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

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