这里有一段有关钩子的代码,看不太明白,希望大侠指点一二。代码说明如下:
---------------------------------------------------------------------------------
窗体A 初始化时调用 Hook 过程
模块BPublic Sub Hook(ByVal hWnd As Long)
lpPrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WndProc)
End SubPublic Sub UnHook(ByVal hWnd As Long)
SetWindowLong hWnd, GWL_WNDPROC, lpPrevWndProc
End SubFunction WndProc(..... 一堆参数) As Long
If HIWORD(wParam) = 消息A Then
...
else if ...
...
End If
WndProc = CallWindowProc(lpPrevWndProc, hWnd, Message, wParam, lParam)
End Function
---------------------------------------------------------------------------------
问题:注册钩子和注销钩子以及钩子的处理函数Wndproc不太明白,那位能给具体解释解释每行代码的作用吗?先谢了!
---------------------------------------------------------------------------------
窗体A 初始化时调用 Hook 过程
模块BPublic Sub Hook(ByVal hWnd As Long)
lpPrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WndProc)
End SubPublic Sub UnHook(ByVal hWnd As Long)
SetWindowLong hWnd, GWL_WNDPROC, lpPrevWndProc
End SubFunction WndProc(..... 一堆参数) As Long
If HIWORD(wParam) = 消息A Then
...
else if ...
...
End If
WndProc = CallWindowProc(lpPrevWndProc, hWnd, Message, wParam, lParam)
End Function
---------------------------------------------------------------------------------
问题:注册钩子和注销钩子以及钩子的处理函数Wndproc不太明白,那位能给具体解释解释每行代码的作用吗?先谢了!
解决方案 »
- TcxTreeList中包含tcxCheckBox的问题?
- 请教在三层程序中显示多个表的数据,而只更新一个表的数据的问题!!!
- 取出数据库记录中的最大值
- sql语句在程序中实现的结果和在查询分析器中的结果不一样,高手指教
- 大家帮忙看看:下面这段代码是哪里出了问题?
- 初学者问题,Deiphl怎么连接SQL数据库?在公司里大家一般是用什么方式来连接数据库的。
- 一个SQL查询的问题,帮帮手,急啊!
- 请问高手Delphi的stringgrid控件在那里啊怎么用
- 获取网页<script>中的参数和链接,求助~!
- 有一字符串,我想从第1个取到第3个怎么取.
- DELPHI 控件群赋值
- 如何获得access表中,表的说明(注释)和字段的说明(注释)???
windows 有一个消息链, 你注册你的钩子 那么你就第一个接触到这些消息然后钩子的处理函数 WndProc是一个回调函数 就是处理你感兴趣的咚咚注销钩子 就把你的钩子从系统链卸载。。
Public Sub Hook(ByVal hWnd As Long)
lpPrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WndProc) //指定wndpro 为消息处理函数
End SubPublic Sub UnHook(ByVal hWnd As Long)
SetWindowLong hWnd, GWL_WNDPROC, lpPrevWndProc //还原默认处理函数
End SubFunction WndProc(..... 一堆参数) As Long
If HIWORD(wParam) = 消息A Then
...
else if ...
...
End If
WndProc = CallWindowProc(lpPrevWndProc, hWnd, Message, wParam, lParam) //向下传递消息
End Function
SetWindowLong的GWL_WNDPROC(常量~子类化窗口过程,其它常量参考MSDN);
WndProc是回调函数,这里替换原窗口过程。钩子按调用范围分全局,局部钩子;用途分有键盘、鼠标等等
具体查看SetWindowsHookEx的帮助文档!
写全局钩子必须注意:钩子句柄和一些要用的全局变量应该用共享内存块存储起来,或者也可以使用消息(不过比较麻烦)
都没有出现 SetWindowsHookEx