免费预览已结束,剩余43页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
厦门大学软件学院毕业论文 本科毕业论文(科研训练、毕业设计)题 目:鼠标键盘录制回放研究与实现姓 名:学 院:软件学院系:软件工程专 业:软件工程年 级:2004级学 号:04369061指导教师(校内): 职称: 指导教师(校外): 职称: 年 月 摘 要本文通过对Windows消息机制和HOOK技术的介绍,综述了Windows的消息机制以及Windows平台下的HOOK函数的特点和其应用。在Windows的消息驱动机制下,深入的讨论和研究利用HOOK技术完成鼠标键盘录制回放系统的程序实现原理和方法。此外,针对不同于Windows消息机制不同的Linux操作系统,本文中给出了基于Linux内核的键盘录制技术的一些思路和建议,希望本文能够为以后此类工作提供帮助和较有价值的信息。 而在此前的系统实现中,已经分别完成了基于.Net平台和基于VC的鼠标键盘录制回放系统的项目开发。目前已经存在众多的鼠标键盘录制回放软件,但是在使用的过程中,总会发现不足之处。开发本软件,一方面是为了对鼠标键盘的录制回放研究进行系统实现;另一方面也是为了提供一个进行自动化测试的工具。为了能够提供一个高效稳定的鼠标键盘录制回放程序,在软件的开发过程中,参考了众多的文献和资料,在这里对以上作者表示感谢。为了介绍本软件的使用价值和方法,挖掘本软件的使用潜力,本文将会对所完成的系统功能和细节进行详细的描述。关键词:HOOK 鼠标键盘录制回放 消息AbstractThrough the introduction of Windows Message Mechanism and HOOK technology, this paper summaries the features and applications of them. Based on Windows Message Mechanism, this paper makes a deep discussion and research in the development of Automate REC/PLAY Utility. On the other hand, this paper studies the method of Keyboard record under the Linux. During the development stage, the Utility has been both developed by .NET and VC. There are many versions of software in this kind, but so many defaults can be found in them. Against such a background, there are two purposes of development of this software: First, it is an implementation of the research in the development of Automate REC/PLAY Utility; then it can provide an automated test tool. In the development, many documentation and papers are referenced, thanks for their writer. At last, this paper will give a detailed introduction of the two software.Keyword:HOOK Mouse and Keyboard record and play Message 目录第一章 引言11.1 选题背景11.2 鼠标键盘录制回放的主要问题11.3 技术研究和系统实现成果11.4 论文结构2第二章 相关技术研究32.1 Windows消息机制32.2 鼠标消息和键盘消息42.3 HOOK机制研究4第三章 .NET平台下的项目实现83.1 系统开发项目管理83.2 可行性分析93.3 功能框图和系统流程图93.4 系统概要设计113.4.1 软件总体设计和程序设计流程123.4.2 重要函数简介143.4.3 主要数据结构173.5 鼠标键盘录制详细设计183.7 辅助技术简介213.7.1 界面多风格实现213.7.2 多语言切换213.8 VC平台下的项目实现简介223.9 本章小结22第四章 系统运行及案例分析234.1 .NET平台下的系统运行234.2 VC平台下的系统运行324.3 本章小结34第五章 Linux下键盘录制和模拟研究355.1 Linux下键盘工作机理355.2 Linux下键盘录制设计365.2.1 方案一 利用中断进行记录365.2.2 方案二 函数劫持进行记录375.3本章小结39第六章 总结416.1项目开发感想416.2技术展望41致谢语42参考文献43ContentChapter 1 Introduction11.1 Backgroud11.2 Main issues11.3 The achievement of this paper11.4 Paper structure2Chapter 2 Related technology study32.1 Windows Message Mechanism32.2 Mouse Message and Keyboard Message42.3 HOOK Mechanism4Chapter 3 The development of the software83.1 Project Management83.2 Feasibility Study93.3 system flow chart93.4 PreliminaryDesign113.4.1 Architecture Design123.4.2 The introduction of functions143.4.3 Data Structure173.5 Detailed Design of the software183.7 Assistive technologies213.7.1 Multi Styles213.7.2 Multi Language213.8 The introduction of VC version software223.9 Summary22Chapter 4 Software Running and Case study234.1 The .NET versiong software running234.2 The VC versiong software running 324.3 Summary34Chapter 5 Keyboard Record under Linux355.1 The process of Keyboard working under Linux355.2 Keyboard Record under Linux research365.2.1 Solution 1 Through IRQ365.2.2 Solution 2 Through Function hijacking375.3 Summary39Chapter 6 Summary416.1 Project Development Feelings416.2 Technology Foresight41Acknowledgement42References43IV第一章 引言1.1 选题背景随着个人计算机的普及,计算机在这个社会中正扮演着越来越重要的角色。然而在生活当中,使用计算机的时候不得不面临着反复的同样的操作的尴尬,如软件测试人员在进行软件测试的时候,不得不重复去进行着同样的操作,而参与到各种游戏世界里的人也出现了同样的情况,所以这个时候,各种各样的鼠标键盘录制回放软件应运而生然而当使用这些软件的时候,往往会有很多不尽如人意或者不满足自己所需求的地方,所以本文中针对鼠标键盘的录制和回放的原理和相关技术进行了深入的研究,并且实现了基于.Net平台和基于VC的鼠标键盘录制回放系统,希望能够为用户提供一个高效稳定的鼠标键盘录制回放系统和较好的自动化测试工具,同时本文也可成为做类似的研究的一项参考资料。1.2 鼠标键盘录制回放的主要问题HOOK技术已经不再高深莫测,而针对Windows的消息机制的研究资料呈数量级增长,这为实现鼠标键盘的录制和回放提供了理论基础。而如何利用已有的HOOK和Windows消息方面的理论知识,去完成这样的工作;鼠标键盘的每一个动作都会有一个消息传递给操作系统的应用程序,需要该消息的应用程序得到消息后触发相应的事件,在鼠标键盘的动作录制的时候怎样去记录的鼠标键盘动作所产生的消息;将记录的消息以一定的数据格式保存为脚本文件后,利用脚本文件怎样去实现鼠标键盘动作的回放。这些是本文所需直面的问题。1.3 技术研究和系统实现成果在本文中,对Windows的消息机制和HOOK技术进行了综述,探讨了Windows下如何去监听鼠标键盘的消息。通过对此前所完成开发的2个系统的实现的描述,介绍了实现鼠标键盘消息记录以及动作回放的原理和方法。此外,在本文中还对如何在Linux系统下实现键盘动作的录制进行了详细的分析,希望借此使本文的参考价值有所提高。1.4 论文结构 本文第一章主要介绍研究背景主要问题和成果;第二章针对鼠标键盘录制回放的相关技术进行研究;第三章介绍了.NET平台下的系统实现;第四章对.NET平台下和VC平台下完成开发的软件进行系统运行和案例分析;第五章是侧重于Linux下键盘录制技术的研究;第六章是本文和项目开发过程中的总结。第二章 相关技术研究2.1 Windows消息机制 Windows平台是一个消息驱动的操作系统,而操作系统的运行时,各种系统消息和用户消息进行频繁的来来往往。在Windows操作系统中,一切事件都是由消息来进行传递的,而在事件消息中附加上消息参数,由内核通知相应的处理程序进行处理。 而所谓的Windows消息机制,通过系统维护一个或者多个消息队列,所有产生的消息都被放入或者插入到消息队列中。系统会从队列中取出消息,然后根据消息的接收句柄从而把消息发送给拥有该窗口的程序的消息循环当中。而每一个程序都有自己的消息循环,在循环中发现了属于自己的消息,则通过对消息参数的解析,去完成相应的处理。而在没有消息时,消息循环就将控制循环交回给操作系统1。 Windows消息队列是Windows消息机制的一个重要的组成部分。系统为每一个应用程序维护一个消息队列,每当有新的消息产生的时候,就把这个消息放入到这个队列中,由应用程序自己控制取出消息并且加以相应的处理。除特权消息,其他的消息都遵循着先进先出的原则,即先进入消息队列的消息被先处理。图2.1给出了Windows下一般应用程序在消息机制驱动下的处理过程。 图2.1 Windows应用程序的执行过程基于这样的一个消息机制,Windows的应用程序则是按照“事件消息处理”的非顺序机制运行的。事件是因,消息是果,事件产生了消息,消息对应着事件,所以每当键盘和鼠标发生类似于按键按下松开或者单击双击类似事件的时候,都会产生相应的消息。而正因为这些消息的存在,才使得我们有了监听鼠标键盘事件的可能。2.2 鼠标消息和键盘消息在Windows的消息机制下,任何的鼠标和键盘事件都会产生相应的消息,应用程序获得这些消息然后进行消息处理,对鼠标键盘消息的理解是解析消息的关键。对于键盘,每当用户按下或者是松开某个按键的时候,会产生一个中断,该中断激活键盘驱动程序KEYBOARD.DRV来对键盘中断进行处理。KEYBOARD.DRV程序会根据用户不同的操作进行编码,然后调用Windows用户模块USER.EXE来生成键盘消息,并将该消息发送到消息队列中等候处理。按键产生的消息,本文中用到主要是键盘扫描码和虚拟键盘码2。扫描码对应着键盘上的不同键,每一个按键被按下或者释放时,都会产生一个唯一的扫描码作为本身的标识。扫描码依赖于具体的硬件设备的,所以在应用程序中,采用虚拟键盘码来做处理参数,因为虚拟码是由Windows系统定义的从而和硬件无关。当按键产生扫描码时,KEYBOARD.DRV截取按键的扫描码,并将它翻译成对应的虚拟码,再将扫描码和虚拟码一齐编码形成键盘消息。Windows在用户级上通常将这些消息封装在消息参数中,如wParam和lParam。对于鼠标,对鼠标的常用操作会产生相应的消息传递给系统,如同键盘在用户级上,鼠标消息同样被封装在消息参数中wParam和lParam。wParam参数中保存了在消息产生时其他操作进行的状态;用户可以通过位屏蔽操作来判断在该消息产生的同时,其余操作是否正在进行。这正是在程序中判断复杂鼠标操作的基本方法。例如,上面判断拖动操作的程序段就用了位操作wParamMK_LBUTTON,判断在鼠标移动(WM_MOUSEMOVE)的同时鼠标左键是否同时被接下。如果,鼠标左键同时按下,则位操作的结果为TRUE,说明当前操作为拖动操作,程序可以继续进行下一步处理。lParam参数保存了消息产生时鼠标所在点的坐标,其中低16位为X坐标,高16位为Y坐标3。2.3 HOOK机制研究 Windows消息机制使得监听鼠标键盘事件成为可能,而每次鼠标键盘事件都产生相应的消息,那么究竟采取什么样的技术去截获那些消息,处理截获的消息参数,这里就不得不提到HOOK这个概念。 参考过很多的资料,HOOK的发展历史并不是那么的清晰可见。而究竟什么是HOOK,众多的学者有着众多的观念。HOOK最早是出现在操作系统当中的。无论是在Unix 、Windows还是在Linux中都由类似的概念。之所以提出HOOK,在于允许操作系统的用户可以根据自己的需要,在系统的调用过程中插入自己的代码,以此来完成特殊的事情。典型的HOOK就是用自己的功能去替代原有的函数点,当完成对特殊任务的处理后,再次恢复原有的函数点。 在Windows中,可以将HOOK理解成是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,这所监视的窗口可以是由其他的进程所创建的。由于这样的子程的存在,每当有消息到达之后,在目标窗口处理消息之前处理该消息。从这个角度来看,HOOK实际上也可以看作是一个处理消息的程序段,通过系统调用,将它挂入系统。每当特定的消息发出时,在没有到达目的窗口前,HOOK程序先截获该消息,优先得到对该消息的控制权。完成这样的工作后,HOOK函数就可以对消息进行各种各样的处理,包括解析记录等等,完成处理后,可以继续传递该消息或者直接将该消息抛弃4。HOOK技术发展到今天,已经不再像以前那样的高深莫测,而伴随着它在越来越多场合的应用,已经逐渐发展向2个方向了。一种是Windows中的概念,在本文所提到的完成开发的鼠标键盘录制回放系统都采用的是这样技术。在这种情形里,系统实际上已经在可以扩展的地方,预先放好了一些钩子在那里,你可以在自己需要的时候,挂上自己想要的东西(见图2.2)。 图2.2 Windows中的HOOK相对于Windows来说,Unix系统中,其基本思想是一致的,细微的差距在于扩展点的提供上面。Unix系统几乎提供了所有可能的扩展点。而在这里,由于所有可能的另一个意思就是太多,换句话说,Unix没有提供任何的扩展点。这些扩展点,是用户根据自己的需要在使用的过程中自己去发现,自己去勾住的(见图2.3)。 图2.3 Unix中的HOOK模式 在目前看来HOOK技术的发展,正在延续着Unix下的这种路线。HOOK技术在不断的应用中,得到深度和广度上的延伸。在初期HOOK只是用来修改他人系统行为的,进而发展到修改自己的系统行为;从早期的回调模式,扩展到系统行为,再到扩展本系统行为。在这样的过程中,HOOK越来越为复杂,但是有一点应用者的认识越来越清晰,HOOK就是在合适的位置插入自己的代码而扩展或改变原有系统(外系统或本系统)的行为。HOOK技术已经在不断的主动的去寻求新的扩展点,而不仅仅使用源系统所提供的那些,甚至已经派生出一种系统开发方式。HOOK技术对鼠标键盘事件的监听由来已久,从监听密码的输入到金山词霸的屏幕取词,在鼠标键盘消息截取上所能做的应用也越为深入。在Windows下,利用已经定义好的扩展点,即各种类型的钩子直接去截取消息,如键盘钩子可以截取键盘消息,外壳钩子可以截取启动和关闭应用程序的消息等。如图2.4是一个Windows全局HOOK的示意图。 图2.4 Windows下全局钩子示意图如图2.4所示,系统安装了HOOK的程序后是如何开始工作的呢?每一个HOOK安装后,系统都有一个与之相关联的指针列表,称为钩子链表,该链表由系统来维护,列表的指针指向指定的 应用程序定义的 被HOOK子程调用的回调函数,也就是处理子程。当与指定的HOOK类型关联的消息发生的时候,系统就把这个消息传递给HOOK子程进行处理。这就是一个HOOK工作的一个简单的流程5。HOOK是一个永恒的话题,离开了HOOK,有很多技术都将难以实现或者不能实现。如果没有HOOK,可能就没有了病毒的存在,因为不管是DOS下的病毒还是Windows下的病毒,都是依靠HOOK系统的服务来实现自己的功能的。虽然HOOK技术的应用越来越为广泛,但它的未来在哪里?随着 .NET 和 JAVA 对 AOP 的支持,HOOK技术越来越为框架所支持。这也是在此前的系统实现中,基于.NET环境完成项目的一个版本的原因,希望这样的实现能够为HOOK技术在框架上的应用提供有价值的信息。框架对HOOK技术的支持,会使得HOOK直接作为一种解题思想而得到推广,相信在不久的将来,.NET等这些框架会提供一系列的HOOK模式去解决类似的问题,而不是现在的需要使用对C的动态链接库的导入去解决。第三章 .NET平台下的项目实现3.1 系统开发项目管理鼠标键盘录制回放系统在了解了其实现的机理上,并不能看作是一个很复杂的系统。没有涉及到复杂的数据处理和交互,没有对网络通讯协议的交互。为了较好的实现项目的开发,对于这样的一个系统,应该严格的参照一般软件开发的流程,从需求分析、概要设计、详细设计等过程一步一步实现目标。在开发软件的一开始,尽可能的把所有的问题都考虑清楚或解决,然后才会有完善的概要设计和详细设计,然后按照设计去编写代码。在软件的开发过程中,必须打破以前的开发习惯,遵循一个重要的原则,就是减少问题的积累。在软件开发中,我们将代码的实现分为几个阶段,做到每个开发阶段都是可预测的。要每个阶段的bug当即解决掉,而不是积累到最后。如果积累下来,那么将面临的是一个巨大的难题。因为bug是以级数的方式在增长的。所以在分阶段的程序实现中,要保证每个阶段都是可调试的6。在.NET平台下的程序实现,主要分为一下几个阶段(见图31) 图 31 程序设计阶段3.2 可行性分析鼠标键盘录制回放系统的实现中,必须面对的问题: 鼠标键盘的消息如何去监听录制; 鼠标键盘的消息以什么样的数据格式记录成脚本; 针对已存的脚本,怎么样去解析,从而实现鼠标键盘动作的回放。针对问题,利用相关技术研究中的HOOK技术,达成这个目标。在HOOK子程中加入自定义的代码,完成对鼠标键盘消息的监听和录制(见图32)。图32 鼠标键盘消息监听录制针对问题,在相关技术研究中介绍到,任何一个鼠标键盘事件都会产生消息,而操作系统将消息转化为了消息参数。在截取消息的时候,得到的是消息参数,解析该消息参数,进一步得到需要的数据信息。对于鼠标事件,需要记录的是鼠标的位置和状态,对于键盘信息,需要记录的是键盘的按键和相应的状态。所以脚本的数据格式由以上数据信息组成。而这种数据格式必须方便鼠标键盘回放的实现7。针对问题,运用鼠标事件和键盘事件的函数得到解决。将录制的脚本解析成该函数所需要的参数,然后调用该函数,按照需求完成鼠标键盘动作的回放。3.3 功能框图和系统流程图在系统实现中,现阶段的软件开发是基于Windows平台的,主要由核心模块和其他模块组成。其中核心模块完成的是鼠标键盘的录制回放功能;其他模块包含用户界面和一些系统设置等。其总体框架见图33。 图 33 软件总体功能框架 系统的功能模块设计中,针对核心模块设计系统的核心运作流程如图34。 图 34 系统的核心流程在系统的模块和核心流程设计之后,从用户的角度考虑,系统的运行流程见图 35。 图 35 系统用户流程3.4 系统概要设计 由于Windows是消息机制的操作系统,所以任何一次鼠标键盘的事件都会产生相应的消息传递给系统。本软件需要完成的任务就是利用这种消息机制,将用户的动作记录下来,然后在用户需要的时候能够按照用户的要求顺利的完成回放。对于这样的一个系统,总体设计目标见表 31。 表 31 软件总体设计目标目标描述功能性需求自动化录制键盘鼠标消息。基于绝对屏幕坐标,对用户的鼠标、键盘操作进行捕捉,以脚本形式进行记录取指定格式的录制脚本,重现对界面的鼠标、键盘操作。能够体现操作时间间隔。性能性需求鼠标键盘的录制回放过程高效稳定。用户界面友好,操作简单快捷。其他需求系统有自己的独特性和原创性,并且有足够的使用潜力。在Windows平台上实现鼠标键盘的录制和回放,其核心流程就是在发生鼠标键盘事件时,软件能够高效稳定的截取到鼠标键盘的消息,并且不影响操作系统其他的正常工作;在正确的截取到消息的基础上,将消息保存为脚本文件,然后利用这些脚本文件能够顺利的完成鼠标键盘动作的回放。根据上述分析,在程序设计的过程中必须面对如下几个问题:1 采取什么样的机制能够高效稳定的完成系统鼠标键盘事件的监听和截取;2 截取到的消息保存什么样的脚本格式;3 对于保存过的脚本,如何实现脚本动作的回放。3.4.1 软件总体设计和程序设计流程鼠标键盘录制回放软件的主要原理如下:本软件通过钩子将自身加入到系统的应用程序钩子链中,从而监听来自键盘和鼠标消息,然后予以所需的处理,处理完成后,继续传递下一个监听此消息的应用程序;规定一定格式的脚本文件,在第一步中本应用程序监听消息的函数中,将监听得到的消息保存为一定的数据格式;取保存的脚本对用户鼠标键盘的操作予以回放。程序的核心流程见图36。 图36 程序核心流程 针对核心流程,列出所面临的3个主要问题的程序设计流程。这3个主要问题包括:消息监听(见图 37),消息处理(见图 38),动作回放(见图39)。 图37 消息监听基本流程图 图38消息处理基本流程图图 39 动作回放基本流程图3.4.2 重要函数简介在鼠标键盘消息监听中,以下函数扮演着重要的角色: 1将本应用程序挂载到钩子链中: 函数原型:int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); 描述:安装钩子,将应用程序挂载到系统的应用程序钩子链中,监听来自鼠标键盘的消息; 入口参数:按形参数序依次为 安装钩子类型,回调函数的委托,钩子应用程序的实例句柄,当前线程的ID; 出口参数:无;返回值:返回一个int型变量,为0时则监听鼠标键盘事件失败,否则成功。 2本应用程序将鼠标键盘消息使用权交给下一个监听的程序: 函数原型:int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam); 描述:将鼠标键盘的消息传递给下一个监听的应用程序; 入口参数:参照委托的回调函数; 出口参数:无;返回值:返回一个int型变量,为下一给监听程序的hook的id。 完成鼠标键盘消息的监听,必须对监听到的鼠标键盘消息予以处理,而针对键盘消息的处理,在.NET平台下,采用委托的方式来达到目标的实现: 1建立委托: 函数原型:public delegate int HookProc(int ncode, IntPtr wparam, IntPtr lparam); 描述:可以针对不同的回调函数实例化,方便回调函数的使用; 入口参数:所有形参必须和所有的回调函数完全相同; 出口参数:无; 返回值:返回一个int型变量,其意义和值的大小由它指定的回调函数确定; 2鼠标事件处理回调函数: 函数原型:int myMouseHookProc(int nCode, IntPtr wparam, IntPtr lparam);描述:处理本应用程序监听到的鼠标键盘事件消息; 入口参数:无; 出口参数:有鼠标消息时nCode为正数,否则为负;wparam为记录鼠标状态,转化为整型时,大小为512时鼠标移动,513鼠标左键按下,514鼠标左键松开,516右键按下,517右键松开;lparam包含了鼠标的消息,可以转化为鼠标消息结构。 返回值:返回下一个监听鼠标键盘事件消息的hook的ID。 3键盘事件处理回调函数: 函数原型:int KeyBoardHookProc(int nCode, IntPtr wparam, IntPtr lparam); 描述:处理应用程序监听到的键盘消息; 入口参数:无; 出口参数:有键盘消息时nCode为正,lparam包含键盘消息,可以转化为我们的键盘消息结构; 返回值:返回一个int型变量,为下一个监听键盘事件的应用程序的hook的ID。 利用对鼠标键盘事件的监听,得到鼠标键盘的消息,经过自定义函数的处理后,得到鼠标键盘消息的脚本。而利用录制脚本完成鼠标键盘动作的回放,则是基于以下函数完成: 1鼠标动作回放定位: 函数原型:void SetCursorPos(int x, int y); 描述:定位鼠标指针; 入口参数:鼠标指针基于绝对屏幕的横纵坐标,x为横坐标,y为纵坐标; 出口参数:无; 返回值:为空。 2鼠标动作回放: 函数原型:void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo); 描述:回放鼠标动作; 入口参数:dwFlags为鼠标状态,包括移动,左键按下,左键放开,右键按下,右键放开等,在这里其他的参数可全部赋0; 出口参数:无;返回值:为空。 3键盘动作回放: 函数原型:void keybd_event(byte bVk,byte bScan, int dwFlags,int dwExtraInfo); 描述:回放键盘事件; 入口参数:bVK为虚拟键盘码,dwFlags为按键状态,0为按下,2为松开,其他参数可全赋为0; 出口参数:无;返回值:空。3.4.3 主要数据结构1鼠标消息结构: /定义鼠标坐标的结构 public class POINT public int x; public int y; /定义鼠标信息的结构 StructLayout(LayoutKind.Sequential) public class MouseHookStruct public POINT pt; public int hwnd; public int wHitTestCode; public int dwExtraInfo; 2键盘消息: public struct keyboardstruct public int vkCode;/虚拟键盘码 public int scanCode;/键盘的扫描码 public int flags;/键盘按键的状态 public int time; public int dwExtraInfo; 3录制脚本数据格式: 鼠标消息:m,14:13,x,142,y,167,512键盘消息:k,65, x,142,y,167,d鼠标消息中:m为鼠标消息的标记,14:13为时间的记录, “x,142,y,167”记录了鼠标的位置,512记录的当前鼠标的状态(512为移动,513为左键按下,514为左键松开,516为右键按下,517为右键松开);3.5 鼠标键盘录制详细设计鼠标键盘消息的监听利用HOOK技术达到目标的实现。而对于截获的消息的处理则必须自定义函数去实现。这个函数是完成鼠标键盘消息处理,也就是鼠标键盘录制的关键,本文有必要对其进行算法的描述:MyMouseHookProc:函数原型:int MyMouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)描述:鼠标Hook处理回调函数,处理鼠标事件产生的数据信息入口参数:无出口参数:有鼠标消息时nCode为正数,否则为负;wparam为记录鼠标状态,转化为整型时,大小为512时鼠标移动,513鼠标左键按下,514鼠标左键松开,516右键按下,517右键松开;lparam包含了鼠标的消息,可以转化为鼠标消息结构算法描述: /将鼠标事件的信息转化为我们自己定义的鼠标信息结构 MouseHookStruct MyMouseHookStruct =(MouseHookStruct)Marshal.PtrToStructure(lParam,typeof(MouseHookStruct); int mouseState = (int)wParam;/记录鼠标的状态 if (nCode 0) return CallNextHookEx(mouseHook, nCode, wParam, lParam); else 这里将脚本所需要的信息记录在richTextBox中,以便保存脚本; return CallNextHookEx(mouseHook, nCode, wParam, lParam); KeyBoardHookProc:函数原型:int KeyBoardHookProc(int nCode, IntPtr wParam, IntPtr lParam)描述:处理应用程序监听到的键盘消息入口参数:无出口参数:有键盘消息时nCode为正,lParam包含键盘消息,可以转化为我们的键盘消息结构 算法描述: KeyBoardStruct kb = new KeyBoardStruct(); CopyMemory(ref kb, lParam, 20); if (nCode 0) return CallNextHookEx(keyHook, nCode, wParam, lParam); else 这里将脚本所需要的信息记录在richTextBox中,以便保存脚本; return CallNextHookEx(keyHook, nCode, wParam, lParam); 3.6鼠标键盘回放详细设计在本文的3.5节,介绍了关于鼠标键盘录制的2个重要的自定义函数的算法描述,在本节,将对鼠标键盘回放的算法实现,进行介绍。鼠标键盘的动作回放是本软件的核心流程中的最后一个环节,也是2个最重要的组成部分之一。如何高效稳定的完成鼠标键盘动作的回放是进行算法设计时所面临的巨大难题。MouseKeyPlay:函数原型:void MouseKeyPlay()描述:用来利用脚本文件去回放鼠标键盘动作算法描述: /以下程序代码是在所有脚本文件都已成功读入到richTextBox中 int height = txtRecord.Lines.Length-1;/计算记录框中的脚本文件有多少行 for(int i=0;iheight;i+) 从richTextBox中读取第i行脚本;/string =richTextBox.Linesi.ToString() 将该行脚本转化为一个数组;/利用split(,) 从数组中取出我们所需要的信息;/arryiIf(该行脚本记录标记值为m) If(both = 1 | onlymouse = 1)/只针对鼠标或者鼠标键盘全选 SetCursorPos(int x, int y); mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);If(该行脚本记录标记为k) If(both = 1 | onlyKey = 1) kbd_event(byte bVk,byte bScan, int dwFlags,int dwExtraInfo); 3.7 辅助技术简介3.7.1 界面多风格实现目前,软件的用户不仅仅追求的是软件功能性目标的实现,同时对软件的性能性目标的要求也逐渐提高。而在软件开发中,友好的用户界面设计越来越为重视。为了满足不同用户的需求,同时增强本软件的使用潜力,本软件在设计中加入了界面风格的切换。为了实现这以目标,在软件的开发过程中,使用了dotmagic组件。具体算法描述如下:算法描述: 将dotMagic的动态链接库导入本应用程序中; 将本应用程序的Form界面继承改为继承dotMagicForm; If(风格Item.Checked=true) this.Style = VisualStyle.所选中的风格; 其他风格Item.Checked=false;3.7.2 多语言切换随着网络的普及,一个软件的运用已经不仅仅是在一个很小的领域。所以,在软件的开发时,更要站在一个全新的角度去完成软件的设计。越来越多的软件都提供了国际化语言的支持,这样对软件的实用性和使用潜力都会有较大的增强。本软件提供了简体中文、繁体中文、英文3种语言的支持。采用资源文件的方案得以实现。具体算法设计如下:算法描述 定义与不同语言对应的资源文件; IF(语言Item.Checked=true) this.Controls.Clear();/将原来的界面抹去,以便界面重构 Thread.CurrentThread.CurrentUICulture=CultureInfo.GetCultureInfo(资源); InitializeComponent();/重新初始化界面3.8 VC平台下的项目实现简介本文对.NET平台下的项目实现进行了分析,而.NET平台下项目实现中,有很多地方则是依靠对VC的动态链接库的导入实现的。C#语言中并没有对HOOK直接运用的函数。而在VC下的实现则是将对鼠标键盘消息的监听和录制都封装在自定义动态链接库中,而在系统的应用程序中,通过对该自定义的动态链接库进行调用完成鼠标键盘录制的回放。而在.NET平台下和VC平台下的项目实现中,所使用的HOOK的类别也是有所不同的。3.9 本章小结本章着重对.NET平台下完成开发的软件从可行性、功能模块、程序流程、概要设计、详细设计、辅助技术等角度进行了研究。对如何实现鼠标键盘的录制回放进行了算法剖析,介绍了在程序实现中所用到的几个极为重要的函数。同时在最后2节对界面风格和国际化语言的实现进行了介绍。本章所介绍的有些重要函数,在VC平台下软件开发中也会用到,所以在本文的3.9节中,只是简要的介绍了VC平台下的项目实现。第四章 系统运行及案例分析4.1 .NET平台下的系统运行在系统的实现中,为了方便用户的使用,本次开发过程中将该软件打包成安装文件(见图41),用户完成对该软件的安装后,即可正常使用该软件。图 41 软件安装的源文件 完成安装后,则可启动该软件,系统运行,该软件正常使用。程序初始化界面如 图42。软件界面由菜单栏、快捷工具栏、录制脚本区域、状态栏等组成。该软件采用菜单驱动机制,所有的功能均可通过菜单栏的菜单来驱动完成;而快捷工具栏将常用操作以快捷按钮的方式提取出来,如开始停止录制、回放等。图42 程序初始化界面为了对用户的界面有着更进一步的了解,同时通过菜单来进一步的了解本软件的功能,这里将菜单栏的各个下来菜单选项列出,见表41。 表 41 菜单选项列表文件菜单操作菜单帮助菜单窗口菜单工具菜单 打开鼠标键盘录制回放软件后,可以点击开始录制快捷按钮或者菜单栏开始录制选项,则当有鼠标事件或者键盘事件发生时,则会在软件的脚本区域即时的增加该动作的脚本,此时开始录制按钮状态为未激活,停止录制按钮激活,运行界面见 图43;按停止录制后,则不再记录脚本,则开始录制按钮状态激活,停止录制按钮状态未激活,运行界面见图44。图 43 开始录制后运行界面图 43 停止录制后的用户界面完成录制鼠标键盘动作的录制可以将相应的脚本保存尾脚本文件的形式。为了方便用户对本软件的使用,本软件将保存的方式分为“保存”和“另存为” 2种形式。如果为“保存”,则将脚本保存在默认的安装路径下,并且文件名是自动命名的;如果是“另存为”,则由用户自己指定保存的路径和文件名。脚本文件为了方便用户的理解和修改,直接以记事本的格式存储,脚本文件的内容形式见图 44。图 44 录制脚本文件对于鼠标键盘动作回放的系统运行,本文无法以图片的形式形象直观的对该运行过程进行描述。在系统的运行过程中,设置以下运行案例:鼠标移动,鼠标左右键单击,鼠标双击,鼠标对文件拖动,以及非正常的鼠标操作;键盘单一按键,键盘组合键,键盘系统按键,键盘非正常操作;鼠标键盘的协同操作,以及其他一些非正常操作; 重复随意操作;针对以上所设计的案例,进行多次鼠标键盘动作录制回放运行。完成鼠标键盘动作录制回放的运行,软件总体功能性目标得以实现。而在性能性目标上,为了给用户提供一个友好的用户界面,除了界面设计上注意简单易用之外,本软件在设计时,提供了多种风格的支持,具体包括“经典浅色”、“XP风格”、“华丽黑色”、“泫然白银”、“嵌入风格”、“office风格” 这6种界面风格可以选择。图42和图43都是经典浅色下的界面风格;而“XP风格”是和操作系统所关联的(见图4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河北省张家口市(2024年-2025年小学五年级语文)统编版期中考试((上下)学期)试卷及答案
- 研究技术开发项目合同范本
- 电力贸易合同范本
- 医疗行业安全风险防范制度
- 2024至2030年烟雾净化器项目投资价值分析报告
- 2024至2030年拉架弹力型男士内衣项目投资价值分析报告
- 2024年开口螺母项目可行性研究报告
- 2024年半头盔项目可行性研究报告
- 抖音推广合作合同
- 2024至2030年中国雪尼尔绉巾行业投资前景及策略咨询研究报告
- 《C语言程序设计》 课件 3.4switch语句
- 2023年-2024年小学数学教师《小学数学教学论》考试题库及答案
- 奶粉促销活动主持词
- 2024年中央金融工作会议精神心得体会1000字(8篇)
- 2024入团考试题库考试100题题库(含答案)
- 保安培训记录内容
- 公务快艇常规安全
- 案例l五项目三:电动天窗系统的检测与故障排除
- 项目技术方案评审
- JTS180-2-2011 运河通航标准
- 高中生活如何启航 课件 2023-2024学年高一主题班会
评论
0/150
提交评论