基于Windows 的行为模拟引擎的设计与实现
2016-01-09郝永彬韩瑞昕方英兰
郝永彬+韩瑞昕+方英兰
摘要: 针对计算机日常应用中经常会出现的、需要重复进行某些操作的需求,按照记录用户操作、图像对比分析、模拟输入的思路,通过封装Windows API并添加相关算法,构造一个通用的行为模拟引擎,以达到解决重复进行某些操作,通过简化上层编程,方便终端用户的目的。
关键词:输入设备;行为模拟;引擎
中图分类号:TP317 文献标识码:A 文章编号:1009-3044(2015)30-0047-04
The Design and Realization of Behavior Simulation Engine Based on Windows
HAO Yong-bin, HAN Rui-xin, FANG Ying-lan
(College of Computer Science, North China University of Technology, Beijing 100144, China)
Abstract: For computer application which appears frequently in demand or need to repeat an action, it has added related algorithm by encapsulating the Windows API according to record user actions and image analysis and analog input idea. It has constructed a generic simulation engine to reach solutions to repeat certain actions by simplifying the top programming and facilitate the end user's purposes.
Key words: I/O device; behavior simulate; engine
1 概述
随着时代的发展,电脑已成为人们日常工作及生活中不可缺少的设备。而在个人电脑的操作系统中,Windows系统的占有量最大,使用范围也最为广泛。而在诸多应用场景之中,不乏需要使用电脑进行重复操作的情况,比如将文本文档或网页中的信息录入Excel,或是在OA系统中通过点击“确定”等按钮处理大量事务。诸如此类的重复操作由于没有技术支持进行改善或缺乏技术投入,都只能人工进行输入或点击,费时费力且容易出错,降低了工作效率,增加了人工等诸多成本。想一想操作电脑的过程,可以发现电脑上的操作都是通过鼠标、键盘来实现的[1],因此可以考虑开发一个通用的行为模拟引擎解决该类问题。
Windows是微软公司开发并销售的一系列桌面操作系统,至今已推出诸多版本,而最新的版本则是Windows 10。微软公司在发布操作系统时,会同时发布与之相对应的SDK(Software Development Kit,包含在Visual Studio应用程序中),并提供一系列的Windows API(Windows Application Programming Interface, Windows应用程序编程接口)供开发者使用。在诸多的Windows API中,有一系列的I/O相关的API可以提供输入功能,可以实现模拟用户输入的效果。通过封装此类API,并添加模拟用户及颜色/图像分析的相应算法,即可实现一个记录并模拟用户行为的引擎,达到方便上层开发者及有一定计算机编程技术的终端用户的目的。
2 引擎设计与实现
2.1 总体设计
本引擎主要由三个模块构成,即输入记录模块,分析识别模块,模拟输出模块。这三个模块分别导出为三个不同的DLL(DLL全称dynamic linking library.即动态链接库。广泛应用与windows及其他系统中。[2]),以便于更灵活地使用该引擎并拓展其功能。
输入记录模块功能为记录键盘鼠标的输入及在锚点(即屏幕上需进行操作的对象,如文本框、按钮等)出现的时机。分析识别模块功能为在运行时实时监控屏幕,按照需求寻找锚点,并返回锚点坐标。模拟输出模块功能为读取已描述出的行为的信息,并按照该数据模拟鼠标键盘输入。
2.2 输入记录模块设计与实现
2.2.1 模块设计
图1 hook过程演示
本模块是基于Windows Hook[3]技术实现的。Windows Hook(即Windows钩子)是Windows系统中用于监视、截获或重定向发往目标窗口消息的特殊接口[4]。如图1所示,通过设置Hook,可以截获Windows消息队列中传递往应用程序窗口的消息(即虚箭头方向),改为传递往hook程序(即实箭头方向),而本引擎中所要取得的键盘鼠标输入信息就是通过消息队列传递的,所以通过安放监听整个系统的全局Hook,即可获得所有的输入信息。
2.2.2 模块实现
)
该函数的参数中code为消息类型,wParam为按键的状态,lParam为指向LPKBDLLHOOKSTRUCT结构体的指针,该结构体包含了按键事件的详细信息:
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *)lParam;
在输入记录过程中,如需开始或暂停,可通过右ALT加A组合键的方式执行操作,将执行状态标识RecordState取反,也可通过右ALT加I组合键标记锚点动作开始或结束: