论文部分内容阅读
摘要:文章研究了轻量级键盘鼠标模拟脚本引擎,给出了编程实现的关键技术和算法。
关键字:键盘;鼠标;模拟;脚本引擎
中图分类号: TP31 文献标识码:A DOI:10.3969/j.issn.1003-6970.2013.08.018
本文著录格式:[1]吴文辉,任毅.轻量级键盘鼠标模拟脚本引擎实现[J].软件,2013,34(8): 56-57
0 引言
使用电脑会碰到这种情况,需要反复进行某个操作,当重复次数很多时可以借助键盘鼠标模拟引擎来实现,让人从大量重复的工作中解放出来,而且能减少错误。互联网上有这类软件下载,如按键精灵。如果喜欢编程序,可以自己编程实现一个轻量级键盘鼠标模拟脚本引擎。
想一想操作电脑的过程,可以发现电脑上的操作都是通过鼠标、键盘来实现的。例如,安装一个软件,在屏幕上适当的地方,如“下一步”,点击鼠标或者按键盘进行下一步操作。仔细分析一下这个过程发现:要模拟键盘鼠标,必需解决3个问题,一是模拟键盘鼠标动作,二是识别电脑当前显示的图像,三是实现根据具体情况进行不同的模拟动作,即流程控制。编一个键盘鼠标模拟引擎,解决这3个问题,执行编好的脚本就可以实现各种常见自动键盘鼠标操作。下面以C#语言为例讲述轻量级键盘鼠标模拟脚本引擎的实现。
1 模拟键盘鼠标模拟动作
通过函数SendKeys.Send()模拟键盘操作,如模拟键盘按键“k”的语句为:
SendKeys.Send(“k”); SendKeys.Flush();
通过“user32.dll”中的mouse_event()函数模拟鼠标动作,调用该函数可以模拟鼠标左键单击、左键双击、右键单击等动作。
2 图像识别
本文实现轻量级键盘鼠标模拟脚本引擎,为了重复键盘鼠标操作设计,这里不讲述如何实现图像识别,简化处理,只记忆坐标值和识别某坐标位置颜色值,在大多数情况下足够使用。
通过“gdi32.dll”中的CreateDC函数、BitBlt函数实现,在指定坐标处获取1像素大小的位图,然后判断其颜色值。
3 轻量级键盘鼠标模拟脚本引擎
一个脚本引擎应该包含的基本功能有:符号表、词法分析器、语法分析器、语义检查器、中间代码生成器、代码优化器、代码生成器、虚拟机,详细的内容可以参考编译原理相关知识。这里仅实现简单的符号表、语法分析、虚拟机。
考虑轻量级键盘鼠标模拟脚本引擎中的变量、坐标值、颜色值都可以用int类型数据表示,符号表通过Dictionary类型的变量实现。
轻量级键盘鼠标模拟脚本引擎中实现顺序、循环、分支三大基本流程控制,通过这三个流程控制可以实现任意流程。下面分别说明顺序、循环和分支的实现方法:
顺序控制
轻量级键盘鼠标模拟脚本引擎顺序读取脚本,没有控制语句时,按照读取的先后顺序解释执行每句脚本。每执行完一句脚本重新标记当前执行语句。
循环控制
这里简化一下,只实现for循环,其它的可以类似实现。for脚本样例如下:
= i 1 //对变量i赋值1
for i 10 //循环语句开始,在i<10时循环执行循环体,变量i每次增加1
leftmouse 15,15 //在坐标15,15处单击鼠标左键
next //循环语句结束
上面的脚本中,“//”表示后面的内容为注释,每句脚本后面的注释解释了脚本的含义。
轻量级键盘鼠标模拟脚本引擎执行for循环语句的过程如下:
(1) 找到当前for开始语句对应的结束语句next,标记循环体范围
(2) 判断循环变量是否在范围内,是则执行下面的循环体,否则跳到步骤5
(3) 依次执行循环体中的每个语句
a) 如果是break语句,中断循环,跳到步骤5
b) 如果是continue语句,则结束本次循环,跳到步骤4
c) 如果是exit语句,则中断循环,跳到步骤5
d) 其它语句执行相应功能
(4) 循环变量自增1,跳到步骤2
(5) 将当前执行语句标记为next对应的语句,结束循环
分支控制
这里简化一下,只实现一个表达式的判断,if脚本样例如下:
if 15,20 255,90,90,0 //判断坐标15,20处的颜色值是否为255,90,90,0(ARGB)
break //是,跳出循环
else //否则(可选)
leftmouse 15,15 //否,在坐标15,15处单击鼠标左键
endif //if语句结束
轻量级键盘鼠标模拟脚本引擎执行if分支语句的过程如下:
(1) 找到当前if开始语句对应的语句else、endif,标记各分支范围
(2) 获取坐标点颜色值,如果颜色值误差在允许范围内,则认为判断条件成立,执行步骤3,否则跳到步骤5
(3) 依次执行if分支中的每个语句
a) 如果是break语句,中断分支语句,跳到步骤6
b) 如果是continue语句,则结束分支语句,跳到步骤6
c) 如果是exit语句,则中断分支语句,跳到步骤6
d) 其它语句执行相应功能
(4) 跳到步骤6
(5) 如果没有else分支,则跳到步骤6,否则依次执行else分支中的每个语句
a) 如果是break语句,中断分支语句,跳到步骤6
b) 如果是continue语句,则结束分支语句,跳到步骤6
c) 如果是exit语句,则中断分支语句,跳到步骤6
d) 其它语句执行相应功能
(6) 将当前执行语句标记为endif对应的语句,记录当前控制动作(break、continue、exit、none),结束当前分支语句。
上面的三个基本控制语句的实现后,在脚本中可以随意组合、嵌套这三种控制语句,脚本都能正常执行。
4 结论
本文实现的轻量级键盘鼠标模拟脚本引擎可以实现日常中大多数键盘鼠标重复操作,实现过程简单,效率较高,已在某案例中实现每日千次重复操作。在编写脚本时,需要注意延时控制和颜色值的合理利用。可在此基础上实现函数等功能。
参考文献
[1] SHARP J(著), 周靖(译). Visual C# 2010从入门到精通. 清华大学出版社. 2010年.
关键字:键盘;鼠标;模拟;脚本引擎
中图分类号: TP31 文献标识码:A DOI:10.3969/j.issn.1003-6970.2013.08.018
本文著录格式:[1]吴文辉,任毅.轻量级键盘鼠标模拟脚本引擎实现[J].软件,2013,34(8): 56-57
0 引言
使用电脑会碰到这种情况,需要反复进行某个操作,当重复次数很多时可以借助键盘鼠标模拟引擎来实现,让人从大量重复的工作中解放出来,而且能减少错误。互联网上有这类软件下载,如按键精灵。如果喜欢编程序,可以自己编程实现一个轻量级键盘鼠标模拟脚本引擎。
想一想操作电脑的过程,可以发现电脑上的操作都是通过鼠标、键盘来实现的。例如,安装一个软件,在屏幕上适当的地方,如“下一步”,点击鼠标或者按键盘进行下一步操作。仔细分析一下这个过程发现:要模拟键盘鼠标,必需解决3个问题,一是模拟键盘鼠标动作,二是识别电脑当前显示的图像,三是实现根据具体情况进行不同的模拟动作,即流程控制。编一个键盘鼠标模拟引擎,解决这3个问题,执行编好的脚本就可以实现各种常见自动键盘鼠标操作。下面以C#语言为例讲述轻量级键盘鼠标模拟脚本引擎的实现。
1 模拟键盘鼠标模拟动作
通过函数SendKeys.Send()模拟键盘操作,如模拟键盘按键“k”的语句为:
SendKeys.Send(“k”); SendKeys.Flush();
通过“user32.dll”中的mouse_event()函数模拟鼠标动作,调用该函数可以模拟鼠标左键单击、左键双击、右键单击等动作。
2 图像识别
本文实现轻量级键盘鼠标模拟脚本引擎,为了重复键盘鼠标操作设计,这里不讲述如何实现图像识别,简化处理,只记忆坐标值和识别某坐标位置颜色值,在大多数情况下足够使用。
通过“gdi32.dll”中的CreateDC函数、BitBlt函数实现,在指定坐标处获取1像素大小的位图,然后判断其颜色值。
3 轻量级键盘鼠标模拟脚本引擎
一个脚本引擎应该包含的基本功能有:符号表、词法分析器、语法分析器、语义检查器、中间代码生成器、代码优化器、代码生成器、虚拟机,详细的内容可以参考编译原理相关知识。这里仅实现简单的符号表、语法分析、虚拟机。
考虑轻量级键盘鼠标模拟脚本引擎中的变量、坐标值、颜色值都可以用int类型数据表示,符号表通过Dictionary
轻量级键盘鼠标模拟脚本引擎中实现顺序、循环、分支三大基本流程控制,通过这三个流程控制可以实现任意流程。下面分别说明顺序、循环和分支的实现方法:
顺序控制
轻量级键盘鼠标模拟脚本引擎顺序读取脚本,没有控制语句时,按照读取的先后顺序解释执行每句脚本。每执行完一句脚本重新标记当前执行语句。
循环控制
这里简化一下,只实现for循环,其它的可以类似实现。for脚本样例如下:
= i 1 //对变量i赋值1
for i 10 //循环语句开始,在i<10时循环执行循环体,变量i每次增加1
leftmouse 15,15 //在坐标15,15处单击鼠标左键
next //循环语句结束
上面的脚本中,“//”表示后面的内容为注释,每句脚本后面的注释解释了脚本的含义。
轻量级键盘鼠标模拟脚本引擎执行for循环语句的过程如下:
(1) 找到当前for开始语句对应的结束语句next,标记循环体范围
(2) 判断循环变量是否在范围内,是则执行下面的循环体,否则跳到步骤5
(3) 依次执行循环体中的每个语句
a) 如果是break语句,中断循环,跳到步骤5
b) 如果是continue语句,则结束本次循环,跳到步骤4
c) 如果是exit语句,则中断循环,跳到步骤5
d) 其它语句执行相应功能
(4) 循环变量自增1,跳到步骤2
(5) 将当前执行语句标记为next对应的语句,结束循环
分支控制
这里简化一下,只实现一个表达式的判断,if脚本样例如下:
if 15,20 255,90,90,0 //判断坐标15,20处的颜色值是否为255,90,90,0(ARGB)
break //是,跳出循环
else //否则(可选)
leftmouse 15,15 //否,在坐标15,15处单击鼠标左键
endif //if语句结束
轻量级键盘鼠标模拟脚本引擎执行if分支语句的过程如下:
(1) 找到当前if开始语句对应的语句else、endif,标记各分支范围
(2) 获取坐标点颜色值,如果颜色值误差在允许范围内,则认为判断条件成立,执行步骤3,否则跳到步骤5
(3) 依次执行if分支中的每个语句
a) 如果是break语句,中断分支语句,跳到步骤6
b) 如果是continue语句,则结束分支语句,跳到步骤6
c) 如果是exit语句,则中断分支语句,跳到步骤6
d) 其它语句执行相应功能
(4) 跳到步骤6
(5) 如果没有else分支,则跳到步骤6,否则依次执行else分支中的每个语句
a) 如果是break语句,中断分支语句,跳到步骤6
b) 如果是continue语句,则结束分支语句,跳到步骤6
c) 如果是exit语句,则中断分支语句,跳到步骤6
d) 其它语句执行相应功能
(6) 将当前执行语句标记为endif对应的语句,记录当前控制动作(break、continue、exit、none),结束当前分支语句。
上面的三个基本控制语句的实现后,在脚本中可以随意组合、嵌套这三种控制语句,脚本都能正常执行。
4 结论
本文实现的轻量级键盘鼠标模拟脚本引擎可以实现日常中大多数键盘鼠标重复操作,实现过程简单,效率较高,已在某案例中实现每日千次重复操作。在编写脚本时,需要注意延时控制和颜色值的合理利用。可在此基础上实现函数等功能。
参考文献
[1] SHARP J(著), 周靖(译). Visual C# 2010从入门到精通. 清华大学出版社. 2010年.