android键盘关闭回调函数,(钩子应用)按键【回调函数】解决方案

本帖最后由 风__琪仙 于 2015-4-5 16:57 编辑

按键【回调函数】解决方案我们的QQ群是:300275325

可能大家对API函数的使用已经有了一些了解,那么回调函数这个词应该不是太陌生吧。著名的钩子函数就用到了它,但是在按键调用的时候就遇到难题了,钩子函数其中一个参数需要提供子程序地址,也就是回调函数的指针,按键精灵明显是不支持的,那该怎么办?

以下内容如果有冒犯,请谅解,请原谅俺求知之心。

经过一番功夫,终于发现了突破口,大家可以使用SendMessageA函数向按键精灵QUI窗口发送1127消息试试,你会发现窗口过程调用了窗口加载完毕事件子程序,事情到此有了些进展了。而实际上也可以使用GetWindowLong函数取得窗口过程函数地址,然后使用OD跟踪可以看到QUI窗口过程的全貌。

初步问题解决了,但是回调函数它还有3个参数,得怎么办?这里只能拐个弯子写个标准DLL来实现咯。请看以下代码实现键盘钩子的过程。

//回调函数辅助Dll

Declare Function GetSubPtr Lib "Callback.dll" Alias "GetSubPtr"(ByVal hwnd As Long) As Long//取函数地址

Declare Function SetHook Lib "Callback.dll" Alias "SetHook"(ByVal 钩子句柄 As Long) As Long

Declare Function GetPar1 Lib "Callback.dll" Alias "GetPar1"() As Long

Declare Function GetPar2 Lib "Callback.dll" Alias "GetPar2"() As Long

Declare Function GetPar3 Lib "Callback.dll" Alias "GetPar3"() As Long

//功能演示

Declare Function 设置系统钩子_ Lib "user32.dll" Alias "SetWindowsHookExA"(ByVal 钩子类型 As Long,ByVal 回调函数地址 As Long,ByVal 实例句柄 As Long,ByVal 线程ID As Long) As Long

Declare Function 取模块句柄_ Lib "kernel32.dll" Alias "GetModuleHandleA"(ByVal 模块名 As String) As Long

Declare Function 释放系统钩子_ Lib "user32.dll" Alias "UnhookWindowsHookEx"(ByVal 钩子句柄 As Long) As Long

Event Form1.LoadOver

参数一= GetPar1()

参数二= GetPar2()

参数三= GetPar3()

Select Case 参数二

Case 256

Call Plugin.Msg.Tips("按下")

Case 257

Call Plugin.Msg.Tips("放开")

End Select

End Event

Event Form1.Load

钩子句柄 = 设置系统钩子_(13, GetSubPtr(Form1.Hwnd), 取模块句柄_(0), 0)

call SetHook(钩子句柄)

If 钩子句柄>0 Then

MessageBox "键盘钩子安装成功~"

Else

MessageBox "安装失败!"

End If

End Event

Event Form1.UnLoad

call 释放系统钩子_ (钩子句柄)

MessageBox "脚本已经停止!钩子已经释放!!"

End Event复制代码以上代码大家会发现一个神奇之处,明明这几个子程序没有联系在一起,怎么会有用呢?这也正是一大妙处。首先介绍一下[backcolor=rgb(247, 247, 247)]Callback.dll 这个DLL是我自己写的,附带告诉一下大家如何使用标准的DLL吧。习惯了用Com和按键接口的插件,标准的DLL用法可能大家还不知,其实标准DLL的使用也是很简单滴。只要把标准的DLL文件放到按键精灵的插件目录,按键精灵在运行时会自动加载,然后只需要在使用时定义就可以了,如上代码,像定义API函数一样定义即可。

CALLBack.dll 包含了5个函数。

GetSubPtr 取回调函数地址。参数【窗口句柄】 返回【回调函数地址】 好进行下一步使用参数是子程序指针的API函数

SetHook 此属性适用于钩子函数,使用钩子函数时必需使用用于呼叫钩子链的下一个钩子。参数是【钩子句柄】不用为0

GetPar1 取得回调函数的第一个参数

GetPar2 取得回调函数的第二个参数

GetPar3 取得回调函数的第三个参数

在dll内部会调用按键中的“Form1.LoadOver”子程序,然后在“Form1.LoadOver”子程序中取回参数,写功能代码,钩子处理代码,这样就实现了函数的回调。但是缺点也是明显的,那就是只能回调“Form1.LoadOver”子程序,想实现真正的回调还得要工程师多给点支持!!

代码使用步骤:下载2c61ae808fdd9421f9cbc381a95352b6.gifCallback.rar(, 下载次数:138)(CALLBack.dll),解压到按键插件目录,复制以上代码到按键精灵源代码区,设置QUI界面,调试时点击"自定义界面按钮",然后随意按键键盘,可以看到桌面右下角有气泡提示。

由于水平有限走此弯路,同时也希望按键精灵能多公开一些东西给大家使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值