基于HOOK的鼠标键盘录制的实现
2021-02-02倪志慧沈岚岚桂林电子科技大学信息科技学院广西桂林541000
倪志慧 沈岚岚(桂林电子科技大学信息科技学院,广西 桂林 541000)
随着计算机技术的普及,在使用计算机的时候经常会面临反复同样的操作或者需要快速点击的问题,如软件测试人员在进行软件测试的时候,和各种游戏世界里的人物操作,因此,催生了许多种的鼠标键盘录制回放软件。
然而当使用这些软件的时候,往往会有很多不尽如人意或者不满足自己所需求的地方,大部分软件只是录制点击,没有录制鼠标移动的轨迹,所以本文对鼠标键盘的录制和回放的原理和相关技术进行了研究。
1 系统的核心技术介绍
Windows消息机制维护消息队列来进行的,所有产生的消息都被放入消息队列中,而消息对应着事件,每当鼠标发生移动、按键按下松开以及单击双击类似事件的时候,都会产生相应的消息,这就使监听鼠标键盘事件成为了可能。
HOOK技术能够截获消息并对截获的消息参数进行处理,通过系统调用,将HOOK挂入系统。每当特定的消息发出时,在没有到达目的窗口前,HOOK程序先截获该消息,优先得到对该消息的控制权,并可以对消息进行各种各样的处理,完成处理后,再继续传递该消息或者直接将该消息抛弃。
本文使用Java语言,利用JNA包 (Java Native Access)来实现鼠标键盘监听和回放工作。JNA提供一组Java工具类用于在运行期动态访问系统本地库,只要在一个Java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。鼠标键盘的每一个动作都会有一个消息传递给操作系统的应用程序,通过调用的JNA提供的公用Jar包中的接口获取到鼠标键盘动作所产生的HOOK消息;将记录的消息以一定的数据格式保存为脚本文件后,利用脚本文件怎样去实现鼠标键盘动作的回放。
2 系统的实现
2.1 定义鼠标键盘
鼠标键盘录制回放系统的实现中,需要利用Jna包来实现,所以首先需要导入JNA包,定义鼠标键盘钩子以及鼠标键盘钩子数据结构体:
2.2 鼠标键盘信息监听
通过调用的JNA提供的接口,在监听HOOK消息程序中加入自定义的代码,完成对鼠标键盘消息的监听和录制,其实现如下:
2.3 信息的解析和记录
监听截取消息的时候,得到的是消息参数,需要解析该消息参数,进一步得到需要的数据信息。对于鼠标事件,需要记录的是鼠标的位置:和按下的按键,根据消息记录下相应的操作和坐标到txt文件。而键盘只要记录按下的键即可。
完成了鼠标和键盘记录后,使用robot机器人读取记录鼠标操作的TXT文件,将其读到Vector v容器中,相当于一个数组,然后分析内容结构,得知要进行的操作。
2.4 模拟执行
根据分析所得的内容,用robot模拟执行,实现回放,下面代码能够模拟执行鼠标左键单击和键盘按键的操作。
3 结果与使用方法
本文实现了一个鼠标键盘的录制与回访系统,效果如图1所示。
图1 系统主界面
点击开始录制之后,只需要把需要重复的操作,操作一遍,程序便会记录下来,选择导出文件即可,当需要执行重复动作时,选择需要加载的操作文件,点击开始执行,便可以解放双手人程序来完成操作。开始执行前也可以打开文件根据格式修改操作。如图2所示:
图2 信息记录文件
4 结论
本文基于Windows消息机制,利用HOOK技术研究基于JNA实现了一个鼠标键盘录制和回放程序,能够实现记录操作和回放操作。但是鼠标键盘操作执行速度还有所不足,另外在操作回放时,不能使用电脑,不能把需要回放操作的程序后台进行,这是需要改进的地方,有待进一步完善。