求一个按键精灵定时执行脚本的脚本要求0000-9999所有的密码试一遍具体操作是输入0000,回车,回车。类推

查看: 6041|回复: 4
vba 如何调用 按键精灵的脚本
阅读权限20
在线时间 小时
按键精灵不是可以设置快捷键嘛?比如CTRL+M,我使用vba如何发出这样快捷键。使用sendkeys发出的F1~F12是可以调用,但是就是不能调用CTRL+M这样的快捷键,或者还有什么好的方法调用?
阅读权限70
在线时间 小时
为了指定那些与 SHIFT、CTRL 及 ALT 等按键结合的组合键,可在这些按键码的前面放置一个或多个代码,这些代码列举如下:
阅读权限20
在线时间 小时
试过,不响应。
阅读权限20
在线时间 小时
能说明一下你想实现什么样的功能吗?说不定用不到按键精灵,利用VBA就可以实现呢。
阅读权限20
在线时间 小时
我就是想用VBA
本帖最后由 爬来爬去 于
14:36 编辑
就是通过VBA发出一个快捷键调用按键精灵的脚本。
网上搜了下,可以用keybd_event来模拟按键如下:
Call keybd_event(17, 0, 0, 0)
Call keybd_event(37, 0, 0, 0)
Call keybd_event(37, 0, KEYEVENTF_KEYUP, 0)
Call keybd_event(17, 0, KEYEVENTF_KEYUP, 0)
这是ctrl+left的快捷键
这样又出现一个问题,程序运行到前二句已经调用到按键精灵,后二句好像就不执行,那个CTRL就一直处于按住状态。
最新热点 /1
ExcelHome每周都有线上直播公开课,
国内一流讲师真身分享,高手贴身答疑,
赶不上直播还能看录像,
关键居然是免费的!
厚木哥们都已经这么努力了,
你还好意思说学不好Office。
玩命加载中,请稍候
玩命加载中,请稍候
Powered by
本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任! & & 本站特聘法律顾问:徐怀玉律师 李志群律师渗透测试过程中遇到web登录的时候,现在很多场景账号密码都是经过js加密之后再请求发送(通过抓包可以看到加密信息)如图一burp抓到的包,request的post的登录包,很明显可以看到password参数的值是经过前端加密之后再进行传输的,遇到这种情况,普通发包的爆破脚本就很难爆破成功。鉴于这种情况,这边分析四种方式进行绕过加密爆破。
二. 方法和思路
1. 分析找出是哪个js文件进行了password参数值的加密,将该js导入本地动态执行,建一个小型的web服务器,利用浏览器页面将js运行起来,把账号密码发给本地这个服务器,然后本地js执行加密之后把加密的值再给登录的请求,实现普通的发包爆破。(这个时候普通的发包方式password参数的值就是加密之后的值)(这里渲染 js 可以用 webdrive 或者 phantomjs,或者 Node.js 都行)
2. 利用selenium webdriver,本地驱动一个浏览器,完全模拟浏览器的操作,实现浏览器自动登录爆破.(类似的工具,或者 Node.js,按键精灵,QTP 工具等都可以)
3. 通过对js里的加密算法进行破解,或者是理清加密流程,然后利用自己熟知的编程语言实现同样的加密方式(再下使用的是python),写一个效果一样的加密方式,然后把代码嵌入到发包爆破代码里,这种方式字典里账号密码传入的时候,先进行加密再传给登录请求。(也是实现普通的发包爆破)
4. 利用前面的方法,把密码字典全部加密之后生成对应加密字典,然后普通发包爆破的时候传入加密的字典。
三. 具体的分析
1. 第一种方式:本地动态执行js
1) 分析登录界面,根据登录按钮之后进行burp抓包,发现每次登陆之前都会先请求一个页面
而该页面返回的是一个json格式的m开头和e开头的值
下图是直接从浏览器访问的截图
根据元素定位,从登陆页面的 login()函数设置执行断点调试,理清密码利用 js 加密的一个过程,最后找出加密过程为登陆页面中的 rasEncode函数
contextPath:就是网站首页
str :是输入的密码的明文
url :contextPath+”抹掉的路径”,就是上面所说每次登陆之前去请求的页面,请求得到的就是modulus和exponent值
RSAPUB_KEY就是利用RSAUtils.getKeyPair函数加密modulus和exponent得到的值
enpassword就是最后我们在 第一张图里burp 里抓到密码经过 js加密之后的值。
enpassword过程是利用RSAUtils.encryptedString函数,使RSAPUB_KEY为加密秘钥对原始密码进行字符串编码的值进行加密的结果(encodeURIComponent是 JavaScript 中对字符串编码的函数)
document.getElementById(‘password’).value=enpassword,HTML 中一个方法,最好将 enpassword 的值给需要post 的password 字段。
该过程中使用到的最主要的就是RSAUtils.getKeyPair和RSAUtils.encryptedString这两个方法。
通过最 Sources 的搜索,发现这两个方法都是security.js 中定义的。
理清过程和找到对应的 js 之后,就可以将 security.js 文件保存到本地,利用 python(也可以用其他语言)编写一个简易的的服务器接收原始密码,计算输出 js 加密之后的密文。
实现如下:
server.py是起 简易server的脚本
security.js 就是上面找到的加密的 js
index.html获取原始密码的首页,result.html是进行加密的页面
server.py 的代码:
# -*- coding:utf-8 -*-from flask import Flask
from flask import render_template
from flask import request
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def hello_world():
&&& if request.method == 'GET':
&&&&&&& return render_template('index.html')
&&& if request.method == 'POST':
&&&&&&& print request.form['modulus']
&&&&&&& print request.form['exponent']
&&&&&&& print request.form['password']
&&&&&&& return render_template('result.html', modulus=request.form['modulus'], exponent=request.form['exponent'],password=request.form['password'])
if __name__ == '__main__':
&&& app.run(debug=True)
&index.html 的代码:
&!DOCTYPE html&
result.html 的代码:
&!DOCTYPE html&
这个 js 脚本就是图七中加密的过程的精简
var RSAPUB_KEY = '';
var enpassword = '';
var modulus = document.getElementById('modulus').textC
var exponent = document.getElementById('exponent').textC
RSAPUB_KEY = RSAUtils.getKeyPair(exponent, '', modulus);
enpassword = RSAUtils.encryptedString(RSAPUB_KEY, encodeURIComponent('{{ password }}'));
document.getElementById("result").innerHTML =
console.log(enpassword);
server 运行起来之后打开的效果:
下图是最后的运行结果,这也是我们需要的加密之后的值
接着就是爆破的脚本brute.py通过python的request模块实现:
爆破过程:
1.现将 server.py 运行起来
python server.py
2.然后运行爆破脚本
python brute.py
2. 第二种方式
利用selenium webdriver,(或者其他类似的自动化工具)本地驱动一个浏览器,完全模拟浏览器的操作,实现浏览器自动登录爆破。&
webdriver的实现代码如下
3. 第三种方式,通过对js里的加密算法进行破解,或者是理清加密流程:
第一是完全读懂他加密算法的实现然后破解他的加密算法然后用自己熟知的编程语言重写实现对密码加密,或者不用读懂破解他的算法,理清他的逻辑照着写一个就行了,例如他用定义变量,你也定义变量,他循环你也循环,完全照抄翻译式的写一个即可。写一个效果一样的加密方式,然后把代码嵌入到发包爆破代码里,这种方式字典里账号密码传入的时候,先进行加密再传给登录请求。(也是实现普通的发包爆破)
我们可以简单看看他这里的实现逻辑,
从第一种方法分析中我们得知,这里就是实现密码加密的方法,简单的看是一个 RSA 家吗RSAUtils.getKeyPair函数利用exponent和modulus生成加密的公钥,然后RSAUtils.encryptedString利用公钥对密码进行加密,从断点调试中可以得知 RSAPUB_KEY类型是一个对象。
而调用RSAUtils.getKeyPair和RSAUtils.encryptedString这两个函数是 security.js 这个 js 文件里定义的加密方法。
下图是RSAUtils.encryptedString
去看了下标准的 RSA 加密算法,每次得到的 利用相同的公钥enpassword 都会变,因为添加的因子,但是这个 security.js 里的 js 每次的 enpassword 都是固定,所以跟标准的还是有出入,最后花了是哪个小时左右一直没有进展,就没有继续分析下去了。不过这里更多的是提供分析的思路。知道的大牛可以传授我姿势。(如果日后还有时间,会把具体的实现代码补上)&
4. 第四种方式,利用上述的方法,把原始密码字典转换成加密之后的字典,然后普通发包爆破的时候传入加密的字典。
到时候字典做成对应的格式
123456:123456的加密值
做成上面这种字典,发包传入的是是加密之后的值,终端打出来或者爆破成功之后保存的却是原始的值,利用我上文用的这个 spilt 方式取值。
username = U.split(':')[0].strip()
password = U.split(':')[1].strip()
下面是我利用 html 写的一个简单转化的方法,写的很简单,没有实现保存保存的格式大家可以自行修改丰富,或者利用我第一种方式里的那个代码原理去实现
&!DOCTYPE html&
&html lang="en"&
var RSAPUB_KEY = '';
var enpassword = '';
var modulus = '009fcd8f93d6b862bde481ea0a52b17e7fa3efbbf4eca4d8a6a82eddfe57b4cef6720adeadf64e8dc82f57295aa2bad50b19b7cad7af79cd659afb79cf6a0faf88e10c0b93a';
var exponent = '010001';
var RSAPUB_KEY = RSAUtils.getKeyPair(exponent, '', modulus);
for(var ii=100000; ii&1000000; ii++) {
enpassword = RSAUtils.encryptedString(RSAPUB_KEY,
console.log(enpassword);
阅读(...) 评论()当前位置: >>
按键精灵脚本编写方法
按键精灵学习教程一、 键盘命令(2~5 页) 二、鼠标命令(5~13 页) 三、控制命令(13~22 页) 四、颜色/图像命令(22~28 页) 五、其他命令(28~355 页)五、网游脚本实例(35~最后) 一、 键盘命令命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)G e t L a s t Ke y 检 测 上 次 按 键检测上次按键 参数 1 整数型,可选:变量名 无 复制代码 1. 2. 3. 4. 5. //脚本运行到这一行不会暂停,调用的时候立即返回,得到调用之前最后一次按下的按键码保存在变量 Key 里。 Key=GetLastKey() If Key = 13 Then Msgbox &你上次按下了回车键& End If脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. 5. //脚本运行到这一行不会暂停,调用的时候立即返回,得到调用之前最后一次按下的按键码保存在变量 Key 里。 GetLastKey Key If Key = 13 Msgbox &你上次按下了回车键& EndIf命令名称: 命令功能: 命令参数:K e yD o w n 按 住键盘按住 参数 1 整数型,键盘虚拟码(8.X 支持 按键字符) 参数 2 整数型,次数返 回 值: 脚本例子: (8.x 语法)无 复制代码 1. 2. 3. 4. 5. //KeyDown、KeyDownS、KeyDownH //KeyDownS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和 USB 接口的键盘都 可以使用 //KeyDownH: 硬件模拟方式,仅支持 PS(圆口)的键盘 点击查看使用硬件模拟方式的注意事项 KeyDown 65,1 //65 是 A 键的按键码,上面的语句表示按住 A 键 1 次 6. 7. 8. KeyDown &A&,1 //上面的支持按键字符,语句表示按住 A 键 1 次脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. 5. //KeyDown、KeyDownS、KeyDownH //KeyDownS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和 USB 接口的键盘都 可以使用 //KeyDownH: 硬件模拟方式,仅支持 PS(圆口)的键盘 点击查看使用硬件模拟方式的注意事项 KeyDown 65,1 //65 是 A 键的按键码,上面的语句表示按住 A 键 1 次命令名称: 命令功能: 命令参数:K e yPr e s s 按 键键盘按键 参数 1 整数型,键盘虚拟码(8.X 支持 按键字符) 参数 2 整数型,次数返 回 值: 脚本例子: (8.x 语法)无 复制代码 1. 2. 3. 4. 5. 6. 7. 8. KeyPress &A&,1 //上面的支持按键字符,语句表示按 A 键 1 次 //KeyPress、KeyPressS、KeyPressH //KeyPressS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和 USB 接口的键盘都 可以使用 //KeyPressH: 硬件模拟方式,仅支持 PS(圆口)的键盘 点击查看使用硬件模拟方式的注意事项 KeyPress 65,1 //65 是 A 键的按键码,上面的语句表示按 A 键 1 次脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. 5. //KeyPress、KeyPressS、KeyPressH //KeyPressS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和 USB 接口的键盘都 可以使用 //KeyPressH: 硬件模拟方式,仅支持 PS(圆口)的键盘 点击查看使用硬件模拟方式的注意事项 KeyPress 65,1 //65 是 A 键的按键码,上面的语句表示按 A 键 1 次命令名称: 命令功能:K e yU p 弹 起键盘弹起 命令参数:参数 1 整数型,键盘虚拟码(8.X 支持 按键字符) 参数 2 整数型,次数返 回 值: 脚本例子: (8.x 语法)无 复制代码 1. 2. 3. 4. 5. 6. 7. 8. KeyUp &A&,1 //上面的支持按键字符,语句表示松开 A 键 1 次 //KeyUp、KeyUpS、KeyUpH //KeyUpS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和 USB 接口的键盘都可 以使用 //KeyUpH: 硬件模拟方式,仅支持 PS(圆口)的键盘 点击查看使用硬件模拟方式的注意事项 KeyUp 65,1 //65 是 A 键的按键码,上面的语句表示松开 A 键 1 次脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. 5. //KeyUp、KeyUpS、KeyUpH //KeyUpS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和 USB 接口的键盘都可 以使用 //KeyUpH: 硬件模拟方式,仅支持 PS(圆口)的键盘 点击查看使用硬件模拟方式的注意事项 KeyUp 65,1 //65 是 A 键的按键码,上面的语句表示松开 A 键 1 次命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)WaitKey 等 待 按 任 意 键等待按任意键 参数 1 整数型,可选:变量名 无 复制代码 1. Key=WaitKey() 2. 3. 4. 5. //脚本运行到这一行会暂停,当用户按下键盘后继续执行,并且把用户的按键码保存在变量 Key 里 If Key = 13 Then MessageBox &恭喜你按下了回车键& End If脚本例子: (7.x 语法)复制代码 1. WaitKey Key 2. 3. //脚本运行到这一行会暂停,当用户按下键盘后继续执行,并且把用户的按键码保存在变量 Key 里 If Key = 13 4. 5.Msgbox &恭喜你按下了回车键& EndIf二、鼠标命令命令名称: 命令功能: 命令参数:G e t Cur s o r Po s 得 到 鼠 标 位 置 坐 标得到当前鼠标所在的位置坐标 参数 1 整数型,返回 x 坐标 参数 2 整数型,返回 y 坐标返 回 值: 脚本例子: (8.x 语法)无 复制代码 1. GetCursorPos mx,my 2. //把当前鼠标位置的 x 和 y 坐标放在变量 mx 和 my 中脚本例子: (7.x 语法)复制代码 1. VBSCall GetCursorPos(mx,my) 2. //把当前鼠标位置的 x 和 y 坐标放在变量 mx 和 my 中命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)G e t Cur s o r S ha p e 得 到 鼠 标 形 状得到当前鼠标的形状特征 参数 1 整数型,参数 整数型,鼠标的形状值 复制代码 1. 2. 3. 4. 5. 6. 7. //参数: 0 是 6.83 之前的版本默认的参数 //参数: 1 可用于一些在参数 0 下无法区分鼠标形状代码的情况 //下面是我们普通的 WINDOWS 鼠标形状特征 //不同电脑上鼠标形状特征也许不同,请使用&抓点抓色&功能抓取正确的鼠标形状特征 Shape1 =
//下面是我们访问网页超链接时候的手型鼠标形状 Shape2 =
8. 9. 10. 12. 14.shape=GetCursorShape(0) If shape = shape1 Then MessageBox &当前鼠标形状是普通的 WINDOWS 鼠标& MessageBox &当前鼠标形状是手型鼠标& MessageBox &不认识当前鼠标形状!&11. ElseIf shape = shape2 Then 13. Else 15. End If脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 12. 14. //参数: 0 是 6.83 之前的版本默认的参数 //参数: 1 可用于一些在参数 0 下无法区分鼠标形状代码的情况 //下面是我们普通的 WINDOWS 鼠标形状特征 //不同电脑上鼠标形状特征也许不同,请使用&抓点抓色&功能抓取正确的鼠标形状特征 Shape1 =
//下面是我们访问网页超链接时候的手型鼠标形状 Shape2 =
VBSCall Shape=GetCursorShape(0) If shape = shape1 MessageBox 当前鼠标形状是普通的 WINDOWS 鼠标 MessageBox 当前鼠标形状是手型鼠标 MessageBox 不认识当前鼠标形状!11. ElseIf shape = shape2 13. Else 15. EndIf命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)G e t L a s t Cl i ck 检 测 上 次 按 过 的 鼠 标 键检测上一次按下的鼠标代码 参数 1 整数型,可选:变量名 无 复制代码 1. Mouse=GetLastClick() 2. 3. 4. If Mouse =32770 Or Mouse =32769 Then Msgbox &你按下了鼠标左键& End If脚本例子: (7.x 语法)复制代码 1. GetLastClick Mouse 2. If Mouse =32770 Or Mouse =32769 3. 4.Msgbox &你按下了鼠标左键& EndIf命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)L e f t Cl i ck 左 键 单 击模拟点击鼠标左键 参数 1 整数型,次数 无 复制代码 1. 2. 3. 4. 5. //LeftClick、LeftClickS、LeftClickH //LeftClickS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和 USB 接口的鼠标 都可以使用 //LeftClickH: 硬件模拟方式,仅支持 PS(圆口)的鼠标 点击查看使用硬件模拟方式的注意事项 LeftClick 5 //在当前鼠标的位置单击鼠标左键 5 次脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. 5. //LeftClick、LeftClickS、LeftClickH //LeftClickS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和 USB 接口的鼠标 都可以使用 //LeftClickH: 硬件模拟方式,仅支持 PS(圆口)的鼠标 点击查看使用硬件模拟方式的注意事项 LeftClick 5 //在当前鼠标的位置单击鼠标左键 5 次命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)L e f tD o ub l e Cl i ck 左 键 双 击模拟双击鼠标左键 参数 1 整数型,次数 无 复制代码 1. 2. 3. 4. 5. //LeftDoubleClick、LeftDoubleClickS、LeftDoubleClickH] //LeftDoubleClickS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和 USB 接 口的鼠标都可以使用 //LeftDoubleClickH: 硬件模拟方式,仅支持 PS(圆口)的鼠标 点击查看使用硬件模拟方式的注意事 项 LeftDoubleClick 5 //在当前鼠标的位置双击鼠标左键 5 次 脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. 5. //LeftDoubleClick、LeftDoubleClickS、LeftDoubleClickH] //LeftDoubleClickS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和 USB 接 口的鼠标都可以使用 //LeftDoubleClickH: 硬件模拟方式,仅支持 PS(圆口)的鼠标 点击查看使用硬件模拟方式的注意事 项 LeftDoubleClick 5 //在当前鼠标的位置双击鼠标左键 5 次命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)L o ckM o us e 锁 定 鼠 标 位 置锁定鼠标位置,用户将不能通过移动鼠标而改变鼠标位置,而脚本仍可以改变鼠标位置 无 无 复制代码 1. 2. 3. 4. 5. //在脚本开始的时候使用这个命令,可以有效防止用户误触鼠标引起脚本执行出错 LockMouse Do Delay 1000 Loop脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. 5. //在脚本开始的时候使用这个命令,可以有效防止用户误触鼠标引起脚本执行出错 LockMouse While True Delay 1000 EndWhile命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)M i d d l e Cl i ck 中 键 单 击模拟点击鼠标中键 参数 1 整数型,次数 无 复制代码 1. 2. 3. 4. //MiddleClick、MiddleClickS、MiddleClickH //MiddleClickS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和 USB 接口的鼠 标都可以使用 //MiddleClickH: 硬件模拟方式,仅支持 PS(圆口)的鼠标 点击查看使用硬件模拟方式的注意事项 MiddleClick 5 5.//在当前鼠标的位置单击鼠标中键 5 次脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. 5. //MiddleClick、MiddleClickS、MiddleClickH //MiddleClickS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和 USB 接口的鼠 标都可以使用 //MiddleClickH: 硬件模拟方式,仅支持 PS(圆口)的鼠标 点击查看使用硬件模拟方式的注意事项 MiddleClick 5 //在当前鼠标的位置单击鼠标中键 5 次命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)M o us e Whe e l 鼠 标 滚 轮滚动鼠标滚轮 参数 1 整数型,滚动量 无 复制代码 1. 2. 3. 4. //如果滚动量为正,向上滚动;否则向下滚动. //仅支持 Windows 2000 以上的操作系统. MouseWheel 1 //把鼠标滚轮向上滚动 1 格脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. //如果滚动量为正,向上滚动;否则向下滚动. //仅支持 Windows 2000 以上的操作系统. MouseWheel 1 //把鼠标滚轮向上滚动 1 格命令名称: 命令功能: 命令参数:M o ve R 鼠 标 相 对 移 动鼠标相对移动到 参数 1 整数型,X 距离 参数 2 整数型,Y 距离返 回 值: 脚本例子: (8.x 语法)无 复制代码 1. 2. 3. 4. //MoveR、MoveRS、MoveRH //MoveRS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和 USB 接口的鼠标都可 以使用 //MoveRH: 硬件模拟方式,仅支持 PS(圆口)的鼠标 点击查看使用硬件模拟方式的注意事项 //当前鼠标在(100,100)点,使用下面语句 5. 6. 7.MoveR 200,300 //之后,鼠标就被移到了(100+200,100+300)处,也就是坐标(300,400)处 //提示:使用硬件模拟方式不能碰键盘鼠标,否则会导致出错脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. 5. 6. 7. //MoveR、MoveRS、MoveRH //MoveRS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和 USB 接口的鼠标都可 以使用 //MoveRH: 硬件模拟方式,仅支持 PS(圆口)的鼠标 点击查看使用硬件模拟方式的注意事项 //当前鼠标在(100,100)点,使用下面语句 MoveR 200,300 //之后,鼠标就被移到了(100+200,100+300)处,也就是坐标(300,400)处 //提示:使用硬件模拟方式不能碰键盘鼠标,否则会导致出错命令名称: 命令功能: 命令参数:M o ve To 鼠 标 移 动移动鼠标到 参数 1 整数型,X 坐标 参数 2 整数型,Y 坐标返 回 值: 脚本例子: (8.x 语法)无 复制代码 1. 2. 3. 4. 5. 6. 7. 8. 9. //MoveTo、MoveToS、MoveToH //MoveToS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和 USB 接口的鼠标都可 以使用 //MoveToH: 硬件模拟方式,仅支持 PS(圆口)的鼠标 MoveTo 100,200 //把鼠标移动到(100,200)这个点上 intX=50 intY=150 MoveTo intX,intY //把鼠标移动到(intX,intY)这个点上,需要 5.50 以上版本支持.脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. 5. 6. //MoveTo、MoveToS、MoveToH //MoveToS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和 USB 接口的鼠标都可 以使用 //MoveToH: 硬件模拟方式,仅支持 PS(圆口)的鼠标 MoveTo 100,200 //把鼠标移动到(100,200)这个点上 intX=50 7. 8. 9.intY=150 MoveTo intX,intY //把鼠标移动到(intX,intY)这个点上,需要 5.50 以上版本支持.命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)R e s t o re M o us e Po s 恢 复 上 次 保 存 的 鼠 标 位 置保存当前鼠标位置 无 无 复制代码 1. SaveMousePos 2. 3. 4. 5. 6. 7. 8. 9. //保存当前鼠标位置 Delay 100 MoveTo 500,20 Delay 100 RestoreMousePos //将鼠标移动到上一次保存的鼠标位置 //保存/恢复鼠标位置常用于制作网络游戏练功脚本,脚本开始时保存鼠标位置,脚本结束时恢复鼠标位 置, //这样脚本执行后鼠标的位置就不会变化脚本例子: (7.x 语法)复制代码 1. SaveMousePos 2. 3. 4. 5. 6. 7. 8. 9. //保存当前鼠标位置 Delay 100 MoveTo 500,20 Delay 100 RestoreMousePos //将鼠标移动到上一次保存的鼠标位置 //保存/恢复鼠标位置常用于制作网络游戏练功脚本,脚本开始时保存鼠标位置,脚本结束时恢复鼠标位 置, 这样脚本执行后鼠标的位置就不会变化命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子:R i g ht Cl i ck 右 键 单 击模拟点击鼠标右键 参数 1 整数型,次数 无 复制代码 (8.x 语法)1. 2. 3. 4. 5.//RightClick、RightClickS、RightClickH //RightClickS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和 USB 接口的鼠 标都可以使用 //RightClickH: 硬件模拟方式,仅支持 PS(圆口)的鼠标 点击查看使用硬件模拟方式的注意事项 RightClick 5 //在当前鼠标的位置单击鼠标右键 5 次脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. 5. //RightClick、RightClickS、RightClickH //RightClickS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和 USB 接口的鼠 标都可以使用 //RightClickH: 硬件模拟方式,仅支持 PS(圆口)的鼠标 点击查看使用硬件模拟方式的注意事项 RightClick 5 //在当前鼠标的位置单击鼠标右键 5 次命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)S a ve M o us e Po s 保 存 当 前 鼠 标 所 在 位 置保存当前鼠标位置 无 无 复制代码 1. SaveMousePos 2. 3. 4. 5. 6. 7. 8. 9. //保存当前鼠标位置 Delay 100 MoveTo 500,20 Delay 100 RestoreMousePos //将鼠标移动到上一次保存的鼠标位置 //保存/恢复鼠标位置常用于制作网络游戏练功脚本,脚本开始时保存鼠标位置,脚本结束时恢复鼠标位 置, //这样脚本执行后鼠标的位置就不会变化脚本例子: (7.x 语法)复制代码 1. SaveMousePos 2. 3. 4. 5. 6. 7. //保存当前鼠标位置 Delay 100 MoveTo 500,20 Delay 100 RestoreMousePos //将鼠标移动到上一次保存的鼠标位置 8. 9.//保存/恢复鼠标位置常用于制作网络游戏练功脚本,脚本开始时保存鼠标位置,脚本结束时恢复鼠标位 置, 这样脚本执行后鼠标的位置就不会变化命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法) 脚本例子: (7.x 语法)U nl o ckM o us e 解 除 锁 定 鼠 标 位 置解除 LockMouse 命令对鼠标位置的锁定 无 无 复制代码 1. 复制代码 1. 2. //如果用户使用了 LockMouse 命令而没有使用 UnlockMouse 命令,按键精灵会在脚本结束时自动解除锁 定 UnlockMouse命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)W a i t Cl i ck 按 任 意 鼠 标 键 继 续脚本执行到这一句暂停,按下任意鼠标键之后继续 参数 1 整数型,可选:变量名 无 复制代码 1. last_click=WaitClick() 2. MessageBox &您按下了& & last_click脚本例子: (7.x 语法)复制代码 1. WaitClick last_click 2. MessageBox &您按下了& & last_click三、控制命令命令名称: 命令功能: 命令参数:Ca l l 调 用 过 程调用过程 参数 1 字符串型,过程名 返 回 值: 脚本例子: (8.x 语法)无 复制代码 1. 2. 3. 4. 5. 6. 7. Call 子程序(&我是子程序,被你调用了&) EndScript //支持中文名变量 Sub 子程序(啊) Msgbox 啊 End Sub //定义一个过程,可以在脚本中调用这个过程脚本例子: 复制代码 (7.x 语法)命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)Do 循 环条件循环 参数 1 条件型,循环条件 无 复制代码 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 例子 2: 11. i=0 12. Do Until i=0 13. Msgbox &为什么没有循环到我呢?& 14. Loop 15. Msgbox &循环结束& 16. //当循环条件成立的时候,离开循环体 17. 18. 19. 例子 3: 20. i=0 21. Do Until i=1 22. Msgbox &我停不下来啦!!快住手& 例子 1: //支持 Exit Do 命令退出循环 i=0 Do While i=0 Msgbox &我停不下来啦!!快住手& Loop //当循环条件成立的时候,反复执行循环体 23. Loop 24. //当循环条件不成立的时候,反复执行循环体 25. 26. 27. 例子 4: 28. n=0 29. Do While true 30. 31. 32. 33. 34. 35. Msgbox &我将循环 10 次停下来!!& If n&=10 Then //当循环条件成立的时候,离开循环体 Exit do End if n=n+136. Loop 37. Msgbox n & &次& 38. 39. 40. 例子 5: 41. i = 0 42. Do 43. MessageBox &ok& 44. Loop While i && 0 45. //条件放后面,前面的循环内容可以执行一次!脚本例子: (7.x 语法)复制代码 1. 无命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)Fo r 循 环循环一定次数 参数 1 整数型,循环次数 无 复制代码 1. 2. 3. 4. 5. 6. 7. 8. 9. 例子 2: //支持 Exit For 命令退出循环 例子 1: //支持 Exit For 命令退出循环 For i=0 To 9 Delay 100 Next //循环 10 次 10. For 10 11. Delay 100 12. Next 13. //循环 10 次 14. 15. 16. 例子 3: 17. //支持 Exit For 命令退出循环 18. For i=0 to 19 step 2 19. Delay 100 20. Next 21. //循环 10 次 22. 23. 例子 4: 24. //支持 Exit For 命令退出循环 25. For i=0 to 19 step 2 26. 27. 28. 29. 30. Next 31. //循环 5 次 Delay 100 If i&9 Then Exit For End If脚本例子: (7.x 语法)复制代码 1. For 10 2. 3. 4. Delay 100 EndFor //循环 10 次命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)Funct i o n 函 数函数 多类型,多参数 多类型 复制代码 1. 2. 3. 4. 5. 6. 7. //支持 Exit Function 命令退出函数过程 Msgbox 函数过程(&我是函数,被你调用了&) EndScript Function 函数过程(a) 函数过程=a End Function //定义一个函数过程,可以在脚本中调用这个函数 脚本例子: (7.x 语法)复制代码 1. 无命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)G o s ub 调 用 子 程 序调用过程 参数 1 字符串型,过程名 无 复制代码 1. 2. 3. 4. 5. 6. 7. //可带参数传递 Call 子程序(&我是子程序,被你调用了&) EndScript Sub 子程序(a) Msgbox a End Sub //定义一个过程,可以在脚本中调用这个过程脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. 5. 6. Gosub 子程序 EndScript Sub 子程序 Msgbox &我是子程序,被你调用了& Return 子程序 //定义一个过程,可以在脚本中调用这个过程命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)Goto 跳 转 到 标 记跳转到 Rem 标记处 参数 1 字符串型,标号 无 复制代码 1. 2. 3. 4. 5. Goto 标记 Delay 100 Rem 标记 Msgbox &你直接跳到这里了!!,上面的延迟没有被执行!!& //跳转语句,可以跳转到 rem 标记过的标记处继续执行 脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. 5. Goto 标记 Delay 100 Rem 标记 Msgbox &你直接跳到这里了!!,上面的延迟没有被执行!!& //跳转语句,可以跳转到 rem 标记过的标记处继续执行命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)If 如 果 . . 则判断表达式 参数 1 条件型,表达式 无 复制代码 1. 2. 3. 4. 5. 6. 7. 8. 9. 例子 2: i=1 例子 1: i=0 If i=0 Then Msgbox &条件判断符合被通过!!& End If //通过判断表达式的取值,来执行后面的动作或控制10. If i=0 Then 11. 13. 15. Msgbox &条件判断符合被通过!!& Msgbox &否则条件判断符合被通过!!& Msgbox &否则!!& 12. ElseIf i=1 Then 14. Else 16. End If 17. //通过判断表达式的取值,来执行后面的动作或控制脚本例子: (7.x 语法)复制代码 1. i=0 2. 3. 4. 5. If i=0 Msgbox &条件判断符合被通过!!& EndIf //通过判断表达式的取值,来执行后面的动作或控命令名称: 命令功能:If Co l o r 颜 色 判 断判断屏幕某点的颜色 命令参数:参数 1 整数型,屏幕 X 坐标 参数 2 整数型,屏幕 Y 坐标 参数 3 字符串型,颜色 16 进制值 参数 4 整数型,判断条件返 回 值: 脚本例子: (8.x 语法)无 复制代码 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 例子 2: 12. a=1:b=1 13. IfColor 650,118,&78F0E8&,2 Then 14. 16. MessageBox &a& MessageBox &b& 15. ElseIf b=a Then 17. End if 例子 1: //判断条件(0:等于 1:不等于 2:近似等于) IfColor 860,27,&e1b072&,0 Then Msgbox &颜色等于& Else Msgbox &颜色不等于& End If //判断坐标点(860,27)的颜色是否等于 e1b072脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. 5. 6. 7. //判断条件(0:等于 1:不等于 2:近似等于) IfColor 860,27,e1b072,0 Msgbox &颜色等于& Else Msgbox &颜色不等于& EndIf //判断坐标点(860,27)的颜色是否等于 e1b072命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子:R e m 标 记 /注 释标记命令可当注释 参数 1 字符串型,文字 无 复制代码 (8.x 语法)1. 2. 3.//不支持数字开头的和符号作为标记名 //标记命令.即可当注释,也可以为 Goto 跳转指令作标记 Rem 脚本开始脚本例子: (7.x 语法)复制代码 1. 2. //标记命令.即可当注释,也可以为 Goto 跳转指令作标记 Rem 脚本开始命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)R e s t a rt S cr i p t 重 新 启 动 脚 本 运 行重新启动脚本运行 无 无 复制代码 1. For i=0 to 2 2. 3. 4. 5. Delay 1000 Call Plugin.Msg.ShowScrTXT(0, 0, , &屏幕内容填写& & i, &0000FF&) Next RestartScript //重新启动脚本运行脚本例子: (7.x 语法)复制代码 1. 无命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)S e l e ct 情 况 条 件 选 择根据情况选择条件判断 参数 1 条件型,情况 无 复制代码 1. 2. 3. 4. 5. 6. 7. 8. 9. //不支持判断语句 如:Case a&0 UserVar 变量=0 &输入(0~9)数字& //&&---------------------------------------------以下是选择条件结结构判断 Select Case 变量 Case 0 Msgbox &你输入的数字为:0& Case 1 Msgbox &你输入的数字为:1& Case 2 10. 12. 14. 16. 18. 20. 22. 24. 26.Msgbox &你输入的数字为:2& Msgbox &你输入的数字为:3& Msgbox &你输入的数字为:4& Msgbox &你输入的数字为:5& Msgbox &你输入的数字为:6& Msgbox &你输入的数字为:7& Msgbox &你输入的数字为:8& Msgbox &你输入的数字为:9& Msgbox &你输入的数字不正确,请输入(0~9)数字!&11. Case 3 13. Case 4 15. Case 5 17. Case 6 19. Case 7 21. Case 8 23. Case 9 25. Case Else 27. End Select脚本例子: (7.x 语法)复制代码 1. 无命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)S ub 子 程 序定义一个过程 参数 1 字符串型,过程名 无 复制代码 1. 2. 3. 4. 5. 6. 7. //支持 Exit Sub 命令退出子程序过程 Call 子程序() EndScript Sub 子程序() Msgbox &我是子程序,被你调用了& End Sub //定义一个过程,可以在脚本中调用这个过程脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. Gosub 子程序 EndScript Sub 子程序 Msgbox &我是子程序,被你调用了& 5. 6.Return 子程序 //定义一个过程,可以在脚本中调用这个过程命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)W hi l e 如 果 .. 则 循 环条件循环 参数 1 条件型,循环条件 无 复制代码 1. i=0 2. 3. 4. 5. While i=0 Msgbox &我停不下来啦!!快住手& Wend //当循环条件成立的时候,反复执行循环体脚本例子: (7.x 语法)复制代码 1. i=0 2. 3. 4. 5. While i=0 Msgbox &我停不下来啦!!快住手& EndWhile //当循环条件成立的时候,反复执行循环体四、颜色/图像命令命令名称: 命令功能: 命令参数:Fi nd Ce nt e r Co l o r 中 心 找 色在屏幕区域从中心开始查找指定的颜色 参数 1 整数型,屏幕左上角 x 坐标 参数 2 整数型,屏幕左上角 y 坐标 参数 3 整数型,屏幕右下角 x 坐标 参数 4 整数型,屏幕右下角 y 坐标 参数 5 字符串型,16 进制颜色值 参数 6 整数型,返回 x 坐标 参数 7 整数型,返回 y 坐标 返 回 值: 脚本例子: (8.x 语法)无 复制代码 1. //FindCenterColor left,top,right,bottom,c,x,y 2. 3. 4. 5. 6. 7. 8. 9. //在区域内从中心到外围找颜色为 c 的点,把坐标保存在变量 x 和 y 中 //left,top,right,bottom 都是整数或者整数型变量,说明了区域的左,上,右,下界限 //颜色是类似于&0000FF&的字符串,如果不取变量,别忘了加双引号 //如果没有找到这个颜色,则 x 和 y 的值都被置为-1 FindCenterColor 0,0,800,600,&0000FF&,x,y If x&0 and y&0 Then MoveTo x,y End If10. //在区域(0,0,800,600)中找红色(&0000FF&)的点,如果找到,则把鼠标移动到这个点脚本例子: (7.x 语法)复制代码 1. //VBSCall FindCenterColor(left,top,right,bottom,c,x,y) 2. 3. 4. 5. 6. 7. 8. 9. //在区域内从中心到外围找颜色为 c 的点,把坐标保存在变量 x 和 y 中 //left,top,right,bottom 都是整数或者整数型变量,说明了区域的左,上,右,下界限 //颜色是类似于&0000FF&的字符串,如果不取变量,别忘了加双引号 //如果没有找到这个颜色,则 x 和 y 的值都被置为-1 VBSCall FindCenterColor(0,0,800,600,&0000FF&,x,y) If x&0 and y&0 MoveTo x,y EndIf10. //在区域(0,0,800,600)中找红色(&0000FF&)的点,如果找到,则把鼠标移动到这个点命令名称: 命令功能: 命令参数:Fi nd Co l o r 找 色在屏幕区域从左到右、从上到下的查找指定的颜色 参数 1 整数型,屏幕左上角 x 坐标 参数 2 整数型,屏幕左上角 y 坐标 参数 3 整数型,屏幕右下角 x 坐标 参数 4 整数型,屏幕右下角 y 坐标 参数 5 字符串型,16 进制颜色值 参数 6 整数型,返回 x 坐标 参数 7 整数型,返回 y 坐标返 回 值: 脚本例子: (8.x 语法)无 复制代码 1. //FindColor left,top,right,bottom,c,x,y 2. 3. 4. 5. 6. 7. 8. 9.//在区域内从左到右,从上到下找颜色为 c 的点,把坐标保存在变量 x 和 y 中 //left,top,right,bottom 都是整数或者整数型变量,说明了区域的左,上,右,下界限 //颜色是类似于&0000FF&的字符串,如果不取变量,别忘了加双引号 //如果没有找到这个颜色,则 x 和 y 的值都被置为-1 FindColor 0,0,800,600,&0000FF&,x,y If x&0 and y&0 Then MoveTo x,y End If10. //在区域(0,0,800,600)中找红色(&0000FF&)的点,如果找到,则把鼠标移动到这个点脚本例子: (7.x 语法)复制代码 1. //VBSCall FindColor(left,top,right,bottom,c,x,y) 2. 3. 4. 5. 6. 7. 8. 9. //在区域内从左到右,从上到下找颜色为 c 的点,把坐标保存在变量 x 和 y 中 //left,top,right,bottom 都是整数或者整数型变量,说明了区域的左,上,右,下界限 //颜色是类似于&0000FF&的字符串,如果不取变量,别忘了加双引号 //如果没有找到这个颜色,则 x 和 y 的值都被置为-1 VBSCall FindColor(0,0,800,600,&0000FF&,x,y) If x&0 and y&0 MoveTo x,y EndIf10. //在区域(0,0,800,600)中找红色(&0000FF&)的点,如果找到,则把鼠标移动到这个点命令名称: 命令功能: 命令参数:Fi nd Co l o r E x 模 糊 找 色在屏幕区域模糊查找指定的颜色 参数 1 整数型,屏幕左上角 x 坐标 参数 2 整数型,屏幕左上角 y 坐标 参数 3 整数型,屏幕右下角 x 坐标 参数 4 整数型,屏幕右下角 y 坐标 参数 5 字符串型,16 进制颜色值 参数 6 整数型,查找方式 参数 7 整数型,相似度 参数 8 整数型,返回 x 坐标 参数 9 整数型,返回 y 坐标返 回 值: 脚本例子: (8.x 语法)无 复制代码 1. //FindColorEx left,top,right,bottom,c,type,similar,x,y 2. 3. 4. //在区域内找颜色为 c 的点,把坐标保存在变量 x 和 y 中 //left,top,right,bottom 都是整数或者整数型变量,说明了区域的左,上,右,下界限 //颜色是类似于&0000FF&的字符串,如果不取变量,别忘了加双引号 5. 6. 7. 8. 9. 10.//type 表示查找方式。0 为从上往下,从左往右找;1 为从中心往外围找 //similar 为相似度,取 0.3 到 1 之间的小数。数值越大,对相似度要求越严格。推荐取 0.8 //如果没有找到这个颜色,则 x 和 y 的值都被置为-1 FindColorEx 0,0,800,600,&0000FF&,1,0.8,x,y If x&0 and y&0 Then MoveTo x,y11. End If 12. //在区域(0,0,800,600)中,从中间开始找接近红色(&0000FF&)的点,如果找到,则把鼠标移动到这个 点脚本例子: (7.x 语法)复制代码 1. //VBSCall FindColorEx(left,top,right,bottom,c,type,similar,x,y) 2. 3. 4. 5. 6. 7. 8. 9. 10. //在区域内找颜色为 c 的点,把坐标保存在变量 x 和 y 中 //left,top,right,bottom 都是整数或者整数型变量,说明了区域的左,上,右,下界限 //颜色是类似于&0000FF&的字符串,如果不取变量,别忘了加双引号 //type 表示查找方式。0 为从上往下,从左往右找;1 为从中心往外围找 //similar 为相似度,取 0.3 到 1 之间的小数。数值越大,对相似度要求越严格。推荐取 0.8 //如果没有找到这个颜色,则 x 和 y 的值都被置为-1 VBSCall FindColorEx(0,0,800,600,&0000FF&,1,0.8,x,y) If x&0 and y&0 MoveTo x,y11. EndIf 12. //在区域(0,0,800,600)中,从中间开始找接近红色(&0000FF&)的点,如果找到,则把鼠标移动到这个 点命令名称: 命令功能: 命令参数:Fi nd Pi c 找 图在屏幕区域查找指定相似度的图片 参数 1 整数型,屏幕左上角 x 坐标 参数 2 整数型,屏幕左上角 y 坐标 参数 3 整数型,屏幕右下角 x 坐标 参数 4 整数型,屏幕右下角 y 坐标 参数 5 字符串型,bmp 格式图片路径 参数 6 整数型,相似度 参数 7 整数型,返回 x 坐标 参数 8 整数型,返回 y 坐标返 回 值: 脚本例子:无 复制代码 1. //FindPic left,top,right,bottom,filename,similar,x,y (8.x 语法)2. 3. 4. 5. 6. 7. 8. 9.//在区域内从左到右,从上到下找文件名为 filename 的 bmp 文件,把找到的坐标保存在变量 x 和 y 中 //left,top,right,bottom 都是整数或者整数型变量,说明了区域的左,上,右,下界限 //filename 是一个 bmp 格式的图片,需要您自己抓取,最好是 24 位,把边缘都设为单一的颜色 //similar 为相似度,取 0.5 到 1 之间的小数。数值越大,对图片的相似度要求越严格,速度也越快。推荐 取 0.9 //如果没有找到图片,则 x 和 y 的值都被置为-1 //推荐使用周围颜色单一的图片 MessageBox &这个例子会启动一个 Windows 自带的扫雷程序,然后查找扫雷程序里的笑脸图形& RunApp &winmine.exe&10. //加入一点延时,让扫雷程序顺利启动 11. Delay 2000 12. FindPic 0,50,,&winmine.bmp&,0.9,intX,intY 13. If intX&0 and intY&0 Then 14. 15. 17. MoveTo intX,intY MessageBox &找到图形,鼠标已经移到图形上面& MessageBox &没找到!请确认扫雷程序已经打开,并且您用的是 WinXP 系统&16. Else 18. End If 19. //在区域(0,50,)中找与文件 winmine.bmp 中的图形比较接近的地方,如果找到,则把鼠标移 动到这个地方 20. //6.30 版之后,找图的文件路径可以直接引用附件中的图片,不需要释放,例子 21. MessageBox &下面把鼠标先移到 0,0 点,再用附件找图的方式继续查找笑脸& 22. FindPic 0,50,,&Attachment:\winmine.bmp&,0.9,intX,intY 23. If intX&0 and intY&0 Then 24. 25. 27. MoveTo intX,intY MessageBox &找到图形,鼠标已经移到图形上面& MessageBox &没找到!请确认扫雷程序已经打开,并且您用的是 WinXP 系统&26. Else 28. End If 29. MessageBox &脚本演示结束,最好的脚本永远是您自己制作的。 :-)& 30. EndScript脚本例子: (7.x 语法)复制代码 1. //VBSCall FindPic(left,top,right,bottom,filename,similar,x,y) 2. 3. 4. 5. 6. 7. 8. 9. //在区域内从左到右,从上到下找文件名为 filename 的 bmp 文件,把找到的坐标保存在变量 x 和 y 中 //left,top,right,bottom 都是整数或者整数型变量,说明了区域的左,上,右,下界限 //filename 是一个 bmp 格式的图片,需要您自己抓取,最好是 24 位,把边缘都设为单一的颜色 //similar 为相似度,取 0.5 到 1 之间的小数。数值越大,对图片的相似度要求越严格,速度也越快。推荐 取 0.9 //如果没有找到图片,则 x 和 y 的值都被置为-1 //推荐使用周围颜色单一的图片 MessageBox &这个例子会启动一个 Windows 自带的扫雷程序,然后查找扫雷程序里的笑脸图形& VBSCall RunApp(&winmine.exe&)10. //加入一点延时,让扫雷程序顺利启动 11. Delay 2000 12. VBSCall FindPic(0,50,,&winmine.bmp&,0.9,intX,intY) 13. If intX&0 and intY&0 14. 15. 17. MoveTo intX,intY MessageBox &找到图形,鼠标已经移到图形上面& MessageBox &没找到!请确认扫雷程序已经打开,并且您用的是 WinXP 系统&16. Else 18. EndIf 19. //在区域(0,50,)中找与文件 winmine.bmp 中的图形比较接近的地方,如果找到,则把鼠标移 动到这个地方 20. //6.30 版之后,找图的文件路径可以直接引用附件中的图片,不需要释放,例子 21. MessageBox &下面把鼠标先移到 0,0 点,再用附件找图的方式继续查找笑脸& 22. VBSCall FindPic(0,50,,&Attachment:\winmine.bmp&,0.9,intX,intY) 23. If intX&0 and intY&0 24. 25. 27. MoveTo intX,intY MessageBox &找到图形,鼠标已经移到图形上面& MessageBox &没找到!请确认扫雷程序已经打开,并且您用的是 WinXP 系统&26. Else 28. EndIf 29. MessageBox &脚本演示结束,最好的脚本永远是您自己制作的。 :-)& 30. EndScript命令名称: 命令功能: 命令参数:G e t Pi x e l Col o r 得 到 指 定 点 颜 色得到指定位置的点的颜色 参数 1 整数型,屏幕 X 坐标 参数 2 整数型,屏幕 Y 坐标返 回 值: 脚本例子: (8.x 语法)字符串型,得到的颜色 16 进制值 复制代码 1. GetCursorPos x,y 2. 3. 4. cr1=GetPixelColor(x,y) MessageBox cr1 //得到当前点的颜色,并弹出对话框显示出来脚本例子: (7.x 语法)复制代码 1. VBSCall GetCursorPos(x,y) 2. 3. 4. VBSCall color1=GetPixelColor(x,y) MessageBox color1 //得到当前点的颜色,并弹出对话框显示出来 五、其他命令命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)Delay 延 时脚本暂停执行一段时间 参数 1 整数型,延时时间 无 复制代码 1. 2. 3. 4. 5. 6. 7. //{延时}里面填写”毫秒”数 //1 秒=1000 毫秒, 1 分钟=60000 毫秒, 1 小时=3600000 毫秒 Delay 6000 //延迟 6 秒 x = 5000 Delay x //延时 x 秒,这里 x 是 5 秒脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. 5. 6. 7. //{延时}里面填写”毫秒”数 //1 秒=1000 毫秒, 1 分钟=60000 毫秒, 1 小时=3600000 毫秒 Delay 6000 //延迟 6 秒 x = 5000 Delay x //延时 x 秒,这里 x 是 5 秒命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)Im p o r t 导 入 命 令导入一个 vbs 文件或者插件 dll 文件 参数 1 字符串型,vbs 文件或插件 dll 文件 无 复制代码 1. 2. 3. 4. //当文件被导入后,里面的函数可以直接被调用,不需要使用 VBSCall 或 Plugin 命令 //在 VBScript 块中需要调用 vbs 文件或者插件中的函数时,必须采用这种方式,不能再冠以 VBSCall 或 Plugin 关键字 Import &Memory.dll& //导入 Memory 插件命令 脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. //当文件被导入后,里面的函数可以直接被调用,不需要使用 VBSCall 或 Plugin 命令 //在 VBScript 块中需要调用 vbs 文件或者插件中的函数时,必须采用这种方式,不能再冠以 VBSCall 或 Plugin 关键字 Import Memory.dll //导入 Memory 插件命令命令名称: 命令功能: 命令参数:Inp ut B o x 用 户 输 入 对 话 框在对话框中显示提示,等待用户输入文本或单击按钮,并返回文本框内容。 参数 1 字符串型,消息字符串 参数 2 字符串型[可选],标题 参数 3 字符串型[可选],提示框默认内容 参数 4 整数型[可选],对话框 X 坐标位置 参数 5 整数型[可选],对话框 Y 坐标位置返 回 值: 脚本例子: (8.x 语法)字符串型,返回文本框内容 复制代码 1. Dim Input 2. 3. 4. 5. 6. 7. 8. 9. //[可选]意思是,也可以不需要填参数 //如下: Dim Input Input = InputBox(&请输入名字:&) Input = InputBox(&请输入名字:&,&提示:&,&张三&,0,0) MsgBox &输入: & & Input10. MsgBox &输入: & & Input脚本例子: (7.x 语法)复制代码 1. Dim Input 2. 3. 4. 5. 6. 7. 8. 9. //[可选]意思是,也可以不需要填参数 //如下: Dim Input Input = InputBox(&请输入名字:&) Input = InputBox(&请输入名字:&,&提示:&,&张三&,0,0) MsgBox &输入: & & Input10. MsgBox &输入: & & Input 命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)LogStart 开 始 记 录 日 志记录日志 字符串型:文件名 无 复制代码 1. 2. 3. 4. 5. 6. 7. LogStart &C:\a.log& //记录日志 For i = 0 To 3 TracePrint &保存次数:& & i Call Plugin.Msg.ShowScrTXT(0, 0, , &屏幕内容填写:& & i, &0000FF&) Next LogStop //记录日志停止 TracePrint &这句不会输出到日志里!&脚本例子: (7.x 语法)复制代码 1. 无命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)LogStop 停 止 日 志 记 录停止日志记录 无 无 复制代码 1. 2. 3. 4. 5. 6. 7. LogStart &C:\a.log& //记录日志 For i = 0 To 3 TracePrint &保存次数:& & i Call Plugin.Msg.ShowScrTXT(0, 0, , &屏幕内容填写:& & i, &0000FF&) Next LogStop //记录日志停止 TracePrint &这句不会输出到日志里!&脚本例子: (7.x 语法)复制代码 1. 无命令名称:MessageBox 弹 出 对 话 框 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)弹出一个窗口 参数 1 字符串型,提示内容文字 无 复制代码 1. 2. 3. 4. MessageBox &弹出窗口& //提醒: 按键 VBS 语句中也提供了 MessageBox 命令,可以支持变量,因此 MessageBox 命令也可以直接 写成支持变量的方式 x = &提醒窗口& MessageBox x脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. MessageBox &弹出窗口& //提醒: 按键 VBS 语句中也提供了 MessageBox 命令,可以支持变量,因此 MessageBox 命令也可以直接 写成支持变量的方式 x = &提醒窗口& MessageBox x命令名称: 命令功能: 命令参数:Put A t t a chm e nt 释 放 附 件把当前脚本包含的附件展开到指定的路径下 参数 1 字符串型,可选:路径 参数 2 字符串型,可选:要释放的文件返 回 值: 脚本例子: (8.x 语法)无 复制代码 1. 2. 3. 4. 5. 6. 7. //[路径]是指定的相对路径或者绝对路径。 //如果省略[路径]或者[路径]为 . ,则默认展开到按键精灵所在的文件夹中 //可以指定要释放的文件,允许使用通配符,如 *.bmp。如果不指定要释放的文件,则默认释放所有文件 PutAttachment &c:\&,&*.bmp& //将附件中所有后缀是 bmp 的文件释放到 c 盘 PutAttachment &.\plugin&,&*.dll& //将附件中所有后缀是 dll 的文件释放到当前文件夹的 plugin 目录下脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. 5. //[路径]是指定的相对路径或者绝对路径。 //如果省略[路径]或者[路径]为 . ,则默认展开到按键精灵所在的文件夹中 //可以指定要释放的文件,允许使用通配符,如 *.bmp。如果不指定要释放的文件,则默认释放所有文件 PutAttachment c:\ *.bmp //将附件中所有后缀是 bmp 的文件释放到 c 盘 6. 7.PutAttachment .\plugin *.dll //将附件中所有后缀是 dll 的文件释放到当前文件夹的 plugin 目录下命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)R unA p p 运 行启动一个程序或者打开一个文件 参数 1 字符串型,要运行的程序或者文件 无 复制代码 1. 2. 3. //如果程序路径不是变量,别忘了加双引号 RunApp &notepad.exe& //启动 Windows 记事本程序脚本例子: (7.x 语法)复制代码 1. 2. 3. //如果程序路径不是变量,别忘了加双引号 VBSCall RunApp(&notepad.exe&) //启动 Windows 记事本程序命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)S a yS t r i ng 输 入 文 本在当前窗口输入文字 参数 1 字符串型,表达式 无 复制代码 1. 2. 3. SayString &你好啊& x = &我很好& SayString x脚本例子: (7.x 语法)复制代码 1. 2. 3. SayString &你好啊& x = &我很好& SayString x命令名称: 命令功能:S e t S i mM o d e 设 置 模 拟 方 式设置模拟方式 命令参数: 返 回 值: 脚本例子: (8.x 语法)参数 1 整数型,设置模拟方式 无 复制代码 1. 2. 3. 4. 5. 6. 7. 8. 9. //模拟方式(0 普通|1 硬件|2 超级) MessageBox &这个例子会演示 普通/硬件/超级 这三种模拟方式的效果,点击确定后 3 秒钟开始模拟,会 用普通模拟按 3 下 a,硬件模拟按 3 下 b,超级模拟按 3 下 c& Delay 3000 SetSimMode 0 KeyPress 65,3 MoveTo 0,0 Delay 1000 SetSimMode 1 KeyPress 66,310. MoveTo 100,100 11. Delay 1000 12. SetSimMode 2 13. KeyPress 67,3 14. MoveTo 200,200 15. MessageBox &演示结束&脚本例子: (7.x 语法)复制代码 1. 2. 3. 4. 5. 6. 7. 8. 9. //模拟方式(0 普通|1 硬件|2 超级) MessageBox &这个例子会演示 普通/硬件/超级 这三种模拟方式的效果,点击确定后 3 秒钟开始模拟,会 用普通模拟按 3 下 a,硬件模拟按 3 下 b,超级模拟按 3 下 c& Delay 3000 SetSimMode 0 KeyPress 65,3 MoveTo 0,0 Delay 1000 SetSimMode 1 KeyPress 66,310. MoveTo 100,100 11. Delay 1000 12. SetSimMode 2 13. KeyPress 67,3 14. MoveTo 200,200 15. MessageBox &演示结束& 16.命令名称: 命令功能:Tr a ce Pr i nt 调 试 输 出在调试窗口打印文字 命令参数: 返 回 值: 脚本例子: (8.x 语法)参数 1 字符串型,变量名 无 复制代码 1. x=100 2. 3. 4. //可用于输出变量的值 TracePrint x //在调试窗口输出变量 x 的值脚本例子: (7.x 语法)复制代码 1. 2. 3. //可用于输出变量的值 TracePrint x //在调试窗口输出变量 x 的值命令名称: 命令功能: 命令参数:U s e r Va r 用 户 定 义 变 量用于支持用户设置脚本参数 参数 1 字符串型,变量 参数 2 字符串型,默认值返 回 值: 脚本例子: (8.x 语法)字符串型,设置的值 复制代码 1. 2. 3. 4. 5. 6. 7. 8. 9. //标准型自定义变量 //格式: UserVar {变量}={默认值} {注释} //解释:这个命令主要用于用户自定义的设置功能 UserVar var1=30 &当 HP<多少%时,使用红药& UserVar var2=30 &当 MP<多少%时,使用蓝药& //当用户使用这个脚本的时候,可以对这 var1 和 var2 这两个变量的取值进行设置 //下拉型自定义变量 //格式: UserVar 变量=DropList{选项 0:值 0|选项 1:值 1|选项 2:值 2}=默认显示的选项编号 {注 释} //解释:这个命令预先设定多个变量值,用户可在基面通过下拉方式进行选择 &:0.3}=2 &自动补血设置& 11. //特别提醒:默认显示的选项编号从 0 开始 10. UserVar Var1=DropList{&低于 10%时补血&:0.1|&低于 20%时补血&:0.2|&低于 30%时补血脚本例子: (7.x 语法)复制代码 1. 2. 3. //标准型自定义变量 //格式: UserVar {变量}={默认值} {注释} //解释:这个命令主要用于用户自定义的设置功能 4. 5. 6. 7. 8. 9.UserVar var1=30 当 HP<多少%时,使用红药 UserVar var2=30 当 MP<多少%时,使用蓝药 //当用户使用这个脚本的时候,可以对这 var1 和 var2 这两个变量的取值进行设置 //下拉型自定义变量 //格式: UserVar 变量=DropList{选项 0:值 0|选项 1:值 1|选项 2:值 2}=默认显示的选项编号 {注 释} //解释:这个命令预先设定多个变量值,用户可在基面通过下拉方式进行选择 补血设置10. UserVar Var1=DropList{低于 10%时补血:0.1|低于 20%时补血:0.2|低于 30%时补血:0.3}=2 自动 11. //特别提醒:默认显示的选项编号从 0 开始命令名称: 命令功能: 命令参数: 返 回 值: 脚本例子: (8.x 语法)V B S B e g i n. . VB S End VB S 执 行 块构成一个 VBScript 块 无 无 复制代码 1. VBSBegin 2. 3. 4. 5. 6. 7. 8. 9. 11. 12. 13. 14. 15. VBSEnd 16. //下面是使用过程函数 17. name 10 18. Next VBSEnd //在 VBScript 块中可以使用任何 VBScript 语句(包括 VBScript 的条件判断、子程序调用等等),也可 以使用大多数的按键精灵命令。 例子 2: //定义过程必须放在脚本开头! '这是一个注释 Function name(list) msgbox list+1 End Function For i=0 to 5 Msgbox &我在循环运行 VBScript 块哦!!& '这是注释10. VBSBegin脚本例子: (7.x 语法)复制代码 1. VBSBegin 2. 3. For i=0 to 5 Msgbox &我在循环运行 VBScript 块哦!!& 4. 5. 6. 7. 8. 9. 11. 12. 13. 14. Next VBSEnd'这是注释//在 VBScript 块中可以使用任何 VBScript 语句(包括 VBScript 的条件判断、子程序调用等等),也可 以使用大多数的按键精灵命令。 例子 2: //定义过程必须放在脚本开头! '这是一个注释 Function name(list) msgbox list+1 End Function10. VBSBegin15. VBSEnd 16. //下面是使用过程函数 17. name 10 18.Windowns 扫雷游戏脚本实例:Rem Start LockMouse //查找扫雷窗口,句柄存为 hd Plugin hd=Window.Find(&扫雷&,&扫雷&) If hd=0 MessageBox &你应该没有打开扫雷游戏吧?& Else //获得窗口四个角的坐标 Plugin WRect=Window.GetWindowRect(hd) VBS Dim x(4) VBS i=1 While i&=4 VBS WL=Len(WRect) VBS LL=InStr(WRect,&|&) If LL&&0 VBS x(i)=left(WRect,LL-1) VBS WRect=right(WRect,Wl-LL) Else VBS x(i)=WRect EndIf VBS i=i+1 EndWhile VBS Dim hg,sg //计算横格数 VBS hg=int((x(3)-x(1)-20)/16) //计算竖格数 VBS sg=Int((x(4)-x(2)-100)/16) MoveTo x(3)+1,x(4)+1 LeftClick 1 Delay 10 Plugin Window.SendKeyPress(hd,88) Delay 10 Plugin Window.SendKeyPress(hd,89) Delay 10 Plugin Window.SendKeyPress(hd,90) Delay 10 Plugin Window.SendKeyPress(hd,90) Delay 10 Plugin Window.SendKeyPress(hd,89) Delay 10 Plugin Window.SendKeyPress(hd,16) Delay 10 Plugin Window.Active(hd) //雷区最左上角一格的坐标 VBS x0=x(1)+21:y0=x(2)+100 VBS i=0 //用鼠标扫描整个雷区 While i&sg VBS j=0 While j&hg MoveTo x0+j*16,y0+i*16 Delay 5 IfColor 0,0,ffffff,0 LeftClick 1 Else IfColor 0,0,0,0 Else KeyPress 116,1 Goto Start EndIf EndIf VBS j=j+1 EndWhile VBS i=i+1 EndWhile EndIf UnlockMouse EndScript按键插件《扫雷》系列一【读取内存】 内存读取插件,用于读取某窗体句柄所在进程内存。与按键精灵本身提供的“VBSCall ReadMemory()”功能几乎相 同。 不同点在于: 1、VBSCall ReadMemory()读取最前台窗口内存。Plugin Memory.Read()读取某窗体的内存。 2、Memory 插件,提供更多更丰富的功能。 在给出 Memory 插件例子之前,先说说 windows 如何管理进程内存的,知其然要知其所以然,避免概念上的错误 理解。 在说内存之前,我们要知道 windows 是多进程的操作系统,CPU 时间片根据进程优先级的不同在各个进程中切 换,从而实现了多进程的管理机制。要详细解释“进程-内存”的关系比较复杂,一两篇文章也说不清楚。这里我就简要 说明几个与本文有关联的系统知识。 绝大多数学过计算机编程的同学,应该都清楚,在编写程序的时候,根本就没有多进程的概念,也不会向这方面 想。但一到涉及到内存的时候就会犯迷糊,windows 这么多进程,到底应该读取哪个地方的内存呢?其实不是这样的, windows 只是模拟出多进程的环境,实际的运算都在 CPU 上完成,而一个 CPU 在一个时间只能处理一条指令,也就是 说,对于 cpu 而言,只是单进程操作(请允许我提到 CPU、指令这些与汇编有关系的内容,我想不到如何能把这个概 念简单的描述出来,这些是概念,看懂意思就没问题了) 。windows 模拟多进程的操作,大概是这样的:把进程 A 送到 CPU 中处理 20 微秒-&保存进程 A 环境-&进程 B 送到 CPU 中处理 20 微秒-&保存进程 B 环境……一直循环这个过程。 CPU 的速度很快,系统在多进程切换,我们基本上感觉不到。所以实现了“多进程”。 现在轮到内存了:_) 内存这里是个比较卡人的地方,当初我也卡在这里过,其实当初也是因为概念不明而已,我在这里详细说说。 windows 有一套自己的内存管理方案,每个进程都独享独立的 4G 虚拟地址空间(注意这里,是虚拟地址内存,非物理 内存,当初我就卡在这里了) 。这个 4G,在每个进程中都是真实存在的,但因为是虚拟内存(注意这里,这里所说的 虚拟内存和调节 windows 的虚拟内存不是一个东西) ,程序用到的内存部分,加载到物理内存,供给 cpu 读取,用不到 的,依然还是硬盘上的文件。所以实际的物理内存占用并不高。明白这个概念,之后的东西就好办了。我们在读取内 存的时候,读出来的都在虚拟里,windows 是不允许用户直接操作物理内存的(这里涉及到 ring0/3 环的问题,与本文 无关,略过,只要记住,我们不要考虑物理内存就可以了) 。举个例子,我们读取进程 A 中的 50000 地址,再读取进程 B 中的 50000 地址,读的地址,完全不同,因为他们放到两快虚拟内存中。至于它到底在物理内存中哪个位置,只有 windows 知道(其实对程序员来说,也没有必要知道) 。 我反复强调了“进程-内存”,是因为我当初卡在这里过,如果看到这里,你还是云里雾里,那么建议你回头再看一 遍。 讲完了概念,进入正题: 我们要做的,正是读取 windows 自带的经典游戏《扫雷》中的“雷”所在的位置,旨在用代码描述内存插件的使用 方法。我始终坚信,代码是最好的老师,比任何教程都强。所以我直接给出注释全面的代码,以供分析。 //********************************** //* 以下例子只支持 xp 操作系统中扫雷 * //********************************** // //hwnd 中保存扫雷游戏的窗体句柄 Dim hwnd //查找《扫雷》的窗体句柄 Plugin hwnd=Window.Find(&扫雷&,&扫雷&) If hwnd=0 MessageBox &扫雷游戏没有打开哟!& EndScript EndIf //x, y 中分别保存当前扫雷的长与宽的格子数量 Dim x, y Plugin x=Memory.Read32Bit(hwnd,&h1005334) Plugin y=Memory.Read32Bit(hwnd,&h1005338) //建个双重循环,循环所有格子,这里用 VBScript 的循环会很方便,所以加入 vbsbegin 块 Import Memory.dll VBSBegin Dim i, j, value, strview strview=&说明:@代表安全,*代表雷& & vbcrlf For i=0 to x-1 For j=0 to y-1 value=Memory.Read8Bit(hwnd,&h1005360+(j+i*32+1)) '注意:VBSBegin 中的注释是“'” '//8A=显示出的雷 '//8F=未显示出的雷 If value=&h8A& or value=&h8F& then strview=strview & & *& Else strview=strview & & @& End If Next strview=strview & vbcrlf Next MessageBox strview VBSEnd 相信大家都可以通过插件的函数名称判断函数的作用,以上代码很简单,我不做过多讲解了哈 下部分,轮到 windows 插件,我会详细讲解“窗体位置”的概念按键插件《扫雷》系列二【窗口位置】按照惯例,首先介绍下“窗口坐标系”、“窗口工作区”和“窗口客户区”的概念,最后给出自动扫雷脚本。 “窗口坐标系”是我自创的描述词,术语叫什么我还真不清楚。这个概念很容易理解,我们都知道桌面分辨率,分 辨率越高,显示的 桌面内容就越多。我们也知道,窗口是“摆放”在桌面上的,甚至可以超出桌面范围(比如随意把一个窗口拖到桌面之 外) 。而窗口坐标系就 是窗口摆放在桌面的位置。假设桌面是 1024× 768,那么桌面左上角坐标就是 0,0。桌面右下角坐标就是 1023× 767(因 为是从 0 开始) 。这样, 窗口所在桌面的坐标就是“窗口坐标系”了。 “窗体工作区”和“窗体客户区”,这两个词从字面上很难理解,微软的官方文档就是这么叫的。我用一张图来表示 工作区和客户区 有什么不同。 从上图可以看出,工作区包含了窗体的四条边框,上面的边框最宽,叫做标题栏,其他的边框只有窄窄的一条。 为什么要区分工作区 和客户区呢?大家会议下 XP 系统默认的标题栏高度和 98/2000 系统默认的标题栏高度就明白了。也就是说,我们编写 按键脚本的时候,直接从客 户区入手,这样就不用考虑标题栏高度和四条窗体边框的问题了。 下面的脚本例子,建议大家输出看看结果,对理解工作区和客户区有帮助: //************************** //*窗体工作区 与 窗体客户区* //************************** // //启动扫雷 VBSCall RunApp(&winmine.exe&) //等待扫雷启动完毕 Delay 500 dim hwnd Plugin hwnd=Window.Find(&扫雷&,&扫雷&) //移动扫雷窗口到 0,0 位置 Plugin Window.Move(hwnd,0,0) dim winrect, clirect //获得 windows 区域 Plugin winrect=Window.GetWindowRect(hwnd) //获得 client 区域 Plugin clirect=Window.GetClientRect(hwnd) MessageBox &窗体工作区:& & winrect & vbcrlf & &窗体客户区:& & clirect 明白了基本概念之后,下面给出扫雷脚本的鼠标控制例子: //********************************** //* 以下例子只支持 xp 操作系统中扫雷 * //********************************** // //hwnd 中保存扫雷游戏的窗体句柄 Dim hwnd //查找《扫雷》的窗体句柄 Plugin hwnd=Window.Find(&扫雷&,&扫雷&) If hwnd=0 MessageBox &扫雷游戏没有打开哟!& EndScript EndIf //获取扫雷窗口位置 dim cliectRect Plugin cliectRect=Window.GetClientRect(hwnd) //rx, ry 保存雷区左上角第一个雷的坐标 dim rx, ry //按“|”分割字符串 dim tmp tmp=split(cliectRect,&|&) //:是 VB 里的一种多行语句写成一行的用法,同样试用于按键脚本 rx=cint(tmp(0))+20 : ry=cint(tmp(1))+60 //x, y 中分别保存当前扫雷的长与宽的格子数量 Dim x, y Plugin x=Memory.Read32Bit(hwnd,&h1005334) Plugin y=Memory.Read32Bit(hwnd,&h1005338) //建个双重循环,循环所有格子,这里用 VB 的循环会很方便,所以加入 vbsbegin 块 Import Memory.dll VBSBegin Dim i, j, value For i=0 to x-1 For j=0 to y-1 value=Memory.Read8Bit(hwnd,&h1005360+(j+i*32+1)) '//F==非雷 If value&&&hF&then MoveTo rx+j*16,ry+i*16 Delay 100 RightClick 1 Delay 100 End If Next Next VBSEnd 如果上一章的内容弄懂了,这篇还是真容易理解的。 下章,准备说一下“消息循环”机制,和用消息控制扫雷按键插件《扫雷》系列二【窗口消息】新人总会在论坛里看到后台挂机,后台消息,到底消息是什么,为什么可以实现后台,是本章描述的重点。同样 最后会给出消息的扫 雷例子。 消息,在 windows 里占有至关重要的位置,可以说 windows 就是由消息驱动的。消息,顾名思义,就是通知、告 知某个窗体或某个控件 现在应该接到了什么命令。windows 的消息非常的多,有鼠标移动的,键盘按下弹起的,有窗口位置移动的,改变窗 体大小,最小化,最大化等 。可以说,所能看到的桌面窗体变化、鼠标键盘操控,最终体现在 windows 里的都是消息。 windows 掌管一个大的消息循环,为理解方面,我用一张草图描述这个流程: 由上图可知,消息最终发送到每个窗体,每个窗体接到这个消息命令后,怎么处理那都是各个窗体自己的活了。 但是前面的部分确是 由 windows 掌管的。 明确了以上的内容,大家应该知道为什么有些游戏用消息不好使,有些游戏游戏用消息好使了。如果游戏自己做 了某种判断,或者有 些反外挂的程序在运行(比如 NP) ,那么消息对其无效,可以简单理解,游戏对消息做了过滤(这么描述不准确,但 我们只要知道了这点,就 足够了,如想了解更多消息的内容,百度上有很多文章) 。所以,消息不是所有游戏都通用的。 接下来说另外一个概念,窗口的组成。我们可以看到一个窗口,并且拖拉,最小化它。但是这个窗口,不一定由 一个窗体组成。比如 IE 浏览器,IE 浏览器就好比一个房子,里面有很多房间,每个房间就是一个窗体,这些房间共同组成了房子。用过 VB 的朋友,应该很容易理解 。每拖的一个控件,都有独立的窗口句柄(句柄的概念在后面会讲到) ,只有 table 除外。只有游戏不同,一般的游戏, 通常只有一个窗体,因 为是 DX 成像,反到不需要这许多控件。什么是 DX 成像?就是用 DX 把要显示的画面,画到窗体上。 以上内容说的非常混乱,简单理解就是,普通应用程序有很多个窗口组成一个大的窗口。而游戏,一般只有一个 窗口。 这么多窗口,windows 怎么知道哪个是哪个呢?聪明的 windows 引入了“窗体句柄”的概念。一个窗口对应一个数 字,这个数字在文档 中就叫做句柄了。注意,没有一个句柄是相同的,好像门牌号一样,这样就可以顺利区分到底在给哪个窗口发送消息 了。还有一点也非常重要,这个句柄是 windows 随机分配的,有效期只在这个窗口销毁前。换句话说,窗口 A 只要存在,那么他的句柄就是固 定的,如果关闭、再启动窗 口 A,那么窗口 A 的句柄就会变化。假如连续启动了 3 个窗口 A,那么 3 个窗口 A 的句柄也不一样。 罗里八梭的说了这么多,也不知道大家是否有看明白。如果没看明白,就回头再看一遍,还看不明白,跟帖留言。 总结一下我前面所说的东西: 1、windows 掌管消息分发,发到窗口后,由窗口自行处理 2、一个窗口,可能由 1-N 个窗口组成 3、每个窗体句柄,标识一个窗体或控件 4、窗体句柄的生存周期,就是窗体的生存周期 5、同窗体每次启动,其句柄并不相同 我使用了 361 的后台消息插件,不多废话,直接上例子: //********************************** //* 以下例子只支持 xp 操作系统中扫雷 * //********************************** // //hwnd 中保存扫雷游戏的窗体句柄 Dim hwnd //查找《扫雷》的窗体句柄 Plugin hwnd=Window.Find(&扫雷&,&扫雷&) If hwnd=0 MessageBox &扫雷游戏没有打开哟!& EndScript EndIf //x, y 中分别保存当前扫雷的长与宽的格子数量 Dim x, y Plugin x=Memory.Read32Bit(hwnd,&h1005334) Plugin y=Memory.Read32Bit(hwnd,&h1005338) //建个双重循环,循环所有格子,这里用 VB 的循环会很方便,所以加入 vbsbegin 块 Import Memory.dll Import BGKM5.dll VBSBegin Dim i, j, value For i=0 to x-1 For j=0 to y-1 value=Memory.Read8Bit(hwnd,&h1005360+(j+i*32+1)) '//小于&h80 的,都不是雷 If value&&h80& then //这里的 20 和 60 大家体会一下,16 是雷格式的间距: ) BGKM5.LClick hwnd,20+j*16,60+i*16 Else BGKM5.RClick hwnd,20+j*16,60+i*16 End If Next Next VBSEnd 有没有发现代码居然比上一章的简单,没错,对消息来说,只需要知道给出这个控件偏移的 x,y 然后点击就可以 了。 最后说一下,扫雷只有一个窗口,而且带有游戏性,这也是为什么我拿扫雷做例子的原因: )网络游戏循环找图找坐标详细教程(供新手学习)拜读了 LZ 的贴以后深感 LZ 的无私奉献把这么核心的能发出来,我总结上贴把 LZ 的所发的精简写成源码发出来!图的部 分大家自己抓[General] Description=我的脚本 BeginHotkey=121 BeginHotkeyMod=0 PauseHotkey=0 PauseHotkeyMod=0 StopHotkey=123 StopHotkeyMod=0 RunOnce=1 EnableWindow= Enable=1 AutoRun=0 [Repeat] Type=0 Number=1 [Relative] SetupOCXFile= [Comment] Content=图片自己加好了[Script] VBS dim s(4),t, x1, y1 VBS s(0)=&0&:s(1)=&1&:s(2)=&2&:s(3)=&3&:s(4)=&k& VBS t=0 Rem 1 If t&4 Else VBSCall FindPic(0,0,650,502,&Attachment:\&&s(t)&&.bmp&,0.8,x1,y1) If x1&0 and y1&0 Else [url=file://\\MessageBox]\\MessageBox[/url] t VBS t=t+1 Goto 1 EndIf EndIf 《蜀门》辅助脚本源码//现在发一个目前很红的游戏《蜀门》辅助脚本源码,纯颜色版无封号危险,功能很简单,不过简单游上跟这个差不多 的也要 5 块一星期。 //使用时到按键精灵官方网下载个按键精灵安装,打开,新建个脚本,选源文件,把源码帖在里面就好了。在右边下方 有设置选项。 Delay 64 Plugin ckjb=Window.Foreground() Plugin ckbk=Window.GetWindowRect(ckjb) VBS ckbka=split(ckbk,&|&) bkx1=ckbka(0): bky1=ckbka(1): bkx2=ckbka(2): bky2=ckbka(3) Delay 64 VBS xxts=&脚本初始化,请稍后............................................................& Gosub 写信息 Delay 256 UserVar Hong=50 补血百分比 UserVar lan=50 补蓝百分比 UserVar DZ=DropList{打坐:0|吃药:1}=0 低血选项 UserVar ADZ=6 打坐按键(0--9) VBS ADZ=ADZ+48 UserVar HP=4 加血按键(0--9) VBS HP=HP+48 UserVar MP=5 加蓝按键(0--9) VBS MP=MP+48 UserVar JN=1 技能按键(0--9) VBS JN=JN+48 UserVar wpgq=20e72e 怪物光圈颜色(找物品用,光圈特征色) UserVar nzsz=DropList{随机选择:0|手动选择:1}=0 验证码处理方法 Delay 256 VBSCall FindColorEx(bkx1,bky1+32,bkx1+100,bky1+100,&0300df&,0,0.9,hprX,hprY) VBS hppx=Cint(hprx+hong*1.56): mppx=Cint(hprx+lan*1.56) Delay 256 Gosub HPMP Delay 64 Rem 开始主程序 Delay 100 VBSCall FindColorEx(hprX+280,hprY-4,hprX+283,hprY+4,&0300df&,0,0.8,intX,intY) Delay 16 If intX&0 VBS xxx=1 VBS xxts=&锁定怪物,开始攻击......................................................................................& Gosub 写信息 Delay 100 KeyPress JN,1 Delay 1000 Else Gosub 捡查验证 Delay 32 Gosub 找物 Delay 32 Gosub HPMP Delay 32 VBS xxx=0 KeyPress 9,1 Delay 128 EndIf Delay 64 Goto 开始主程序 Sub 打坐 Delay 1000 Rem g VBSCall FindColorEx(hprx+154,hpry,hprx+156,hpry+18,&0100df&,0,0.8,hpuX,hpuY) Delay 16 VBSCall FindColorEx(hprx+154,hpry,hprx+156,hpry+18,&e0.8,hptX,hptY) Delay 16 If hpuX&0 and hptx&0 Delay 200 Goto r Else Delay 800 Goto g EndIf EndIf Rem r Return 打坐 Sub 找物 VBS dim jwx(5), jwy(5) Delay 64 For 2 VBSCall FindColorEx(bkx1+100,bky1+100,bkx2-100,bky2-100,wpgq,0,0.6,WX,WY) Delay 64 EndFor If WX&0 VBS jwx(0)=0: jwy(0)=0: jwx(1)=30: jwy(1)=0: jwx(2)=-30: jwy(2)=5: jwx(3)=0: jwy(3)=30: jwx(4)=0: jwy(4)=-30 VBS cci=0 For 5 Delay 64 MoveTo jwx(cci)+WX,jwy(cci)+WY Delay 32 VBSCall vas=GetCursorShape(0) Delay 32 If vas= VBS xxts=&发现物品.....................................................................................& Gosub 写信息 Delay 64 RightDown 1 Delay 16 RightUp 1 Delay 64 Goto 捡 EndIf VBS cci=cci+1 EndFor EndIf Rem 捡 Delay 512 Plugin XY = Color.FindShape(bkx1+300,bky1+300,bkx2-200,bky2-200, &-5|0|0,-3|0|0,-1|0|0,1|0|0,3|0|0,5|0|0,7|0|0,9|0|0,11|0|0,13|0|0,15|0|0,17|0|0,19|0|0,21|0|1,23|0|0,25|0|0,27|0|0,29|0|0,31|0|1,33|0|1,3 5|0|1,37|0|0,39|0|0,41|0|0,43|0|0,-5|2|0,-3|2|0,-1|2|0,1|2|0,3|2|0,5|2|0,7|2|0,9|2|0,11|2|0,13|2|0,15|2|0,17|2|1,19|2|1,21|2|1,23|2|0,25|2 |1,27|2|1,29|2|0,31|2|0,33|2|0,35|2|1,37|2|1,39|2|0,41|2|0,43|2|0,-5|4|1,-3|4|0,-1|4|1,1|4|1,3|4|0,5|4|1,7|4|1,9|4|1,11|4|1,13|4|1,15|4|0, 17|4|0,19|4|0,21|4|1,23|4|1,25|4|1,27|4|1,29|4|1,31|4|0,33|4|0,35|4|1,37|4|1,39|4|0,41|4|0,43|4|0,-5|6|0,-3|6|0,-1|6|0,1|6|0,3|6|0,5|6|0, 7|6|0,9|6|1,11|6|1,13|6|0,15|6|0,17|6|1,19|6|1,21|6|1,23|6|0,25|6|1,27|6|1,29|6|0,31|6|0,33|6|0,35|6|1,37|6|1,39|6|1,41|6|0,43|6|0,-5|8| 0,-3|8|0,-1|8|0,1|8|0,3|8|0,5|8|0,7|8|0,9|8|0,11|8|0,13|8|0,15|8|1,17|8|1,19|8|0,21|8|1,23|8|0,25|8|0,27|8|0,17|10|0,19|10|1,21|10|1,23| 10|0,25|10|1,27|10|1,29|10|0,31|10|0,33|10|0,35|10|1,37|10|0,39|10|0,41|10|1,43|10|0&, 1) MyArray = Split(XY, &|&) OKX = Clng(MyArray(0)): OKY = Clng(MyArray(1)) Delay 64 If OKX&0 Delay 64 MoveTo OKX,OKY Delay 64 LeftClick 1 EndIf Delay 64 Return 找物 Sub HPMP VBSCall FindColorEx(hppx,hpry,hppx+1,hpry+8,&01006e&,0,0.7,hpcX,hpcY) If hpcX&0 Delay 128 Else If DZ=0 VBS xxts=&血太少,打坐吧..........................................................................................................& Gosub 写信息 Delay 512 KeyPress ADZ,1 Gosub 打坐 Else KeyPress HP,1 Delay 128 EndIf EndIf VBSCall FindColorEx(hppx,hpry+10,hppx+1,hpry+18,&6d.7,mpcX,mpcY) If mpcX&0 Delay 128 Else If DZ=0 VBS xxts=&蓝太少,打坐......................................................................................................& Gosub 写信息 Delay 512 KeyPress ADZ,1 Gosub 打坐 Else KeyPress MP,1 Delay 128 EndIf EndIf Return HPMP Sub 写信息 Delay 64 Plugin Msg.ShowScrTXT(bkx1+300,bky1+4,bkx1+800,bky1+22,xxts,&0000ff&) Delay 64 Return 写信息 Sub 移动一下 MoveTo (bkx2-bkx1)/2+100,(bky2-bky1)/2+100 Delay 128 LeftClick 1 Delay 128 Return 移动一下 Sub 捡查验证 Delay 16 Plugin XY = Color.FindShape(bkx1, bky1+150, bkx2, bky2-150, &0|0|1,2|0|1,4|0|1,6|0|1,8|0|1,10|0|0,12|0|0,14|0|0,16|0|1,18|0|0,20|0|0,22|0|0,24|0|0,26|0|0,28|0|0,30|0|1,32|0|0,34|0|0,36|0|0,38|0|1, 40|0|1,42|0|1,44|0|0,0|2|1,2|2|1,4|2|1,6|2|1,8|2|0,10|2|0,12|2|1,14|2|1,16|2|1,18|2|1,20|2|1,22|2|0,24|2|0,26|2|1,28|2|1,30|2|0,32|2|0,3 4|2|0,36|2|0,38|2|1,40|2|0,42|2|1,44|2|0,0|4|1,2|4|0,4|4|1,6|4|0,8|4|0,10|4|0,12|4|1,14|4|0,16|4|1,18|4|0,20|4|1,22|4|0,24|4|0,26|4|0,28| 4|1,30|4|0,32|4|1,34|4|0,36|4|0,38|4|1,40|4|0,42|4|1,44|4|0,0|6|1,2|6|1,4|6|1,6|6|1,8|6|0,10|6|0,12|6|1,14|6|1,16|6|1,18|6|1,20|6|1,22|6| 0,24|6|1,26|6|0,28|6|1,30|6|0,32|6|0,34|6|0,36|6|0,38|6|1,40|6|0,42|6|1,44|6|0,0|8|1,2|8|0,4|8|1,6|8|0,8|8|0,10|8|0,12|8|0,14|8|0,16|8|1, 18|8|0,20|8|0,22|8|0,24|8|0,26|8|1,28|8|1,30|8|0,32|8|0,34|8|0,36|8|0,38|8|0,40|8|0,42|8|1,44|8|0,0|10|1,2|10|1,4|10|1,6|10|1,8|10|1,1 0|10|0,12|10|0,14|10|0,16|10|1,18|10|0,20|10|0,22|10|0,24|10|1,26|10|0,28|10|1,30|10|0,32|10|0,34|10|0,36|10|0,38|10|0,40|10|0,42| 10|1,44|10|1&, 1) VBS ccca = Split(XY, &|&) VBS nzco = Clng(ccca(0)): nzcv = Clng(ccca(1)) Delay 16 If nzco&0 If nzsz=0 VBS xxts=&出现验证码,你定义了随机选择,选择失败请等 10 分钟....................................& Gosub 写信息 Delay 16 Gosub 随机选择 ElseIf nzsz=1 VBS xxts=&出现验证码,你定义了手动处理,15 秒后按任意键继续........................& Gosub 写信息 Delay 16 For 7 KeyPress JN,1 Delay 1000 KeyPress JN,1 Delay 1000 EndFor WaitKey EndIf EndIf Return 捡查验证 Sub 随机选择 Delay 32 Randomize VBS szmjg = Int((999 * Rnd) + 1) Delay 32 Plugin XY = Color.FindShape(bkx1, bky1+150, bkx2, bky2-150, &0|0|1,2|0|1,4|0|1,6|0|1,8|0|1,10|0|0,12|0|0,14|0|0,16|0|1,18|0|0,20|0|0,22|0|0,24|0|0,26|0|0,28|0|0,30|0|1,32|0|0,34|0|0,36|0|0,38|0|1, 40|0|1,42|0|1,44|0|0,0|2|1,2|2|1,4|2|1,6|2|1,8|2|0,10|2|0,12|2|1,14|2|1,16|2|1,18|2|1,20|2|1,22|2|0,24|2|0,26|2|1,28|2|1,30|2|0,32|2|0,3 4|2|0,36|2|0,38|2|1,40|2|0,42|2|1,44|2|0,0|4|1,2|4|0,4|4|1,6|4|0,8|4|0,10|4|0,12|4|1,14|4|0,16|4|1,18|4|0,20|4|1,22|4|0,24|4|0,26|4|0,28| 4|1,30|4|0,32|4|1,34|4|0,36|4|0,38|4|1,40|4|0,42|4|1,44|4|0,0|6|1,2|6|1,4|6|1,6|6|1,8|6|0,10|6|0,12|6|1,14|6|1,16|6|1,18|6|1,20|6|1,22|6| 0,24|6|1,26|6|0,28|6|1,30|6|0,32|6|0,34|6|0,36|6|0,38|6|1,40|6|0,42|6|1,44|6|0,0|8|1,2|8|0,4|8|1,6|8|0,8|8|0,10|8|0,12|8|0,14|8|0,16|8|1, 18|8|0,20|8|0,22|8|0,24|8|0,26|8|1,28|8|1,30|8|0,32|8|0,34|8|0,36|8|0,38|8|0,40|8|0,42|8|1,44|8|0,0|10|1,2|10|1,4|10|1,6|10|1,8|10|1,1 0|10|0,12|10|0,14|10|0,16|10|1,18|10|0,20|10|0,22|10|0,24|10|1,26|10|0,28|10|1,30|10|0,32|10|0,34|10|0,36|10|0,38|10|0,40|10|0,42| 10|1,44|10|1&, 1) VBS MyArray = Split(XY, &|&) VBS Xznm = Clng(MyArray(0)): Yznm = Clng(MyArray(1)) Delay 32 If Xznm&0 If szmjg&0 and szmjg&250 VBS abcx=Xznm+10: abcy=Yznm+75 ElseIf szmjg&=250 and szmjg&500 VBS abcx=Xznm+10: abcy=Yznm+101 ElseIf szmjg&=500 and szmjg&750 VBS abcx=Xznm+10: abcy=Yznm+127 ElseIf szmjg&750 VBS abcx=Xznm+10: Yznm+153 EndIf Delay 256 MoveTo abcx,abcy Delay 32 LeftClick 1 Delay 256 MoveTo Xznm+154,Yznm+180 Delay 32 LeftClick 1 Delay 512 Plugin XY = Color.FindShape(bkx1, bky1+100, bkx2, bky2-100, &0|0|1,2|0|1,4|0|1,6|0|1,8|0|1,10|0|0,12|0|0,14|0|0,16|0|1,18|0|0,20|0|0,22|0|0,24|0|1,26|0|1,28|0|1,30|0|1,32|0|0,34|0|0,36|0|0,38|0|0, 40|0|1,42|0|0,44|0|1,46|0|0,48|0|1,50|0|0,52|0|0,54|0|0,56|0|1,58|0|0,60|0|1,62|0|0,64|0|0,66|0|0,68|0|0,70|0|0,72|0|0,74|0|0,76|0|0,7 8|0|0,80|0|0,82|0|0,84|0|0,86|0|0,88|0|1,90|0|1,92|0|1,0|2|1,2|2|0,4|2|1,6|2|0,8|2|1,10|2|0,12|2|0,14|2|0,16|2|1,18|2|0,20|2|0,22|2|0,24| 2|1,26|2|1,28|2|0,30|2|1,32|2|0,34|2|0,36|2|0,38|2|1,40|2|1,42|2|1,44|2|0,46|2|0,48|2|1,50|2|1,52|2|0,54|2|1,56|2|1,58|2|0,60|2|0,62|2| 0,64|2|0,66|2|0,68|2|0,70|2|0,72|2|1,74|2|0,76|2|0,78|2|0,80|2|0,82|2|0,84|2|1,86|2|0,88|2|1,90|2|1,92|2|1,0|4|1,2|4|0,4|4|1,6|4|0,8|4|1, 10|4|0,12|4|0,14|4|0,16|4|1,18|4|0,20|4|0,22|4|0,24|4|1,26|4|1,28|4|0,30|4|1,32|4|0,34|4|0,36|4|0,38|4|1,40|4|1,42|4|1,44|4|0,46|4|0,4 8|4|1,50|4|1,52|4|1,54|4|1,56|4|1,58|4|0,60|4|1,62|4|1,64|4|0,66|4|0,68|4|0,70|4|0,72|4|1,74|4|0,76|4|1,78|4|0,80|4|1,82|4|0,84|4|1,86| 4|1,88|4|1,90|4|1,92|4|1,0|6|1,2|6|0,4|6|1,6|6|0,8|6|1,10|6|0,12|}

我要回帖

更多关于 按键精灵脚本制作教程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信