用Findtext制作的通用版蜘蛛自动脚本:
功能:自动接取任务并且完成、自动旋转攻击、自动捡取净化任务道具,自动组队
使用说明:
仅为1920*1080分辨率制作且界面需按以下说明调节`n 按O打开游戏设置
游戏/界面/无视因分辨率对界面大小的调节打√
减号为开始按键,等于号为退出脚本按键(当选择旋转选项后,等于号要按2次)
技能设置一般RT即可
使用前记得以管理员身份运行此脚本,不然无法使用
防怪技能栏是用来防止领取任务或者完成任务过程中,出现的被怪攻击导致死亡的BUG,随便输入一个技能即可
输入的按键以及转向按钮现在可以设置保存,会自动生成配置文件
;以管理员身份运行
if !A_IsAdmin
{
Run *RunAs "%A_ScriptFullPath%"
ExitApp
}
SetBatchLines,-1
#MaxThreadsPerHotkey 3
#SingleInstance,Force
IniRead,tj,配置文件.txt,选项
IniRead,gk,配置文件.txt,防怪
IniRead,xz,配置文件.txt,转向
Gui, Add, Text, x10 y32 w80 h20 +Center, 打怪输出键
Gui, Add, Text, x10 y64 w80 h20 +Center, 任务防怪键
Gui, Add, Text, x30 y10 w100 h20 +Center, F11查看简要说明
Gui, Add, Edit, x85 y30 w50 h20 Lowercase vtj -Multi, %tj%
Gui, Add, Edit, w50 h20 Lowercase vgk -Multi, %gk%
Gui Add, Checkbox,x10 y80 w80 h20 vxz Checked%xz%,自动旋转
Gui, Add, Button, x50 y105 w70 h30 g确定, 确定
Gui, Show, Center w150 h140, 勇猛
Return
确定:
Gui,Submit ,NoHide
FileDelete 配置文件.txt
IniWrite,%tj%,配置文件.txt,选项
IniWrite,%gk%,配置文件.txt,防怪
IniWrite,%xz%,配置文件.txt,转向
MsgBox 设置已保存
return
F11::
MsgBox,仅为1920*1080分辨率制作且界面需按以下说明调节`n 按O打开游戏设置`n 游戏/界面/无视因分辨率对界面大小的调节打√`n F1为开始,F12为退出,F2为开启转向,F9为关闭转向`n 功能:定点刷蜘蛛、自动接取完成任务、取任务道具、加入队伍、旋转攻击`n 技能设置一般RT即可`n 使用前记得以管理员身份运行此脚本,不然无法使用`n 作者:弎番流水异乡人
return
F1:: ;启动键:我设置为减号
ToolTip,开,0,0
Loop ;循环体,没什么好说的
{
Text:="|<>*92$21.U7UAzgtbVDww8zbt9w183U50DwdNwX9baNAwXBYYdtbY3C1U3sM0w|<>*87$18.Tnwk+3U61bwta0zbYzUo3UQ1zAdtAhtAhh4tb8NUG3sk7U" ;判断蜘蛛出现
if (ok:=FindText(743, 83, 788, 132, 0, 0, Text))
{
If xz =1
{
SendInput {left Up}
}
If xz =0
{
}
SendInput ``
Sleep 250
SendInput,%tj% ;力士输出
SetTimer jsqks,1000 ;计时器,用来计算多少秒后判断任务栏有没有没接取的勇猛任务
}
Else
{
If xz =1
{
SendInput {left Down}
}
If xz =0
{
}
Text:="|<>*138$23.jTy7E60grSrNixou0E0njjx81k3PjjSqTVxkz3mCEsk" ;组队接受选项
if (ok:=FindText(1451-150000, 975-150000, 1451+150000, 975+150000, 0, 0, Text))
{
SendInput y
}
Text:="|<>*106$36.zzzzvzzzzzvzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaw1UB1qxjxxJaxjxx1qN1bBjpRhrNXZRhsxVvhhkRHro0DY0U" ;申请加入队伍
if (ok:=FindText(1654-150000, 1062-150000, 1654+150000, 1062+150000, 0, 0, Text))
{
Send {j Down}
Sleep 200
Send {j Up}
Sleep 200
Send {Alt Down}
Sleep 500
CoordMode, Mouse
X:=ok.1.x, Y:=ok.1.y-20, Comment:=ok.1.id
Click, %X%, %Y%
Sleep 500
Text:="|<>*134$46.zzzzzzzzwzvyzzTznzY0C0900DTjs4AwwzU3zNnnnzvw00DD8E0Tlw00xTzyTnnnb0TU7DDCNwszAwwtU23yk03aTDU3zDyE0y0Dwzs7nvyznzWwTU3zDzPlzzy" ;申请者目录
if (ok:=FindText(744-150000, 24-150000, 744+150000, 24+150000, 0, 0, Text))
{
CoordMode, Mouse
X:=ok.1.x+269, Y:=ok.1.y+85, Comment:=ok.1.id
Click, %X%, %Y%
}
Sleep 200
Send {Alt Up}
Sleep 300
}
Text:="|<>*84$71.yzyTrDrzrxxzw1wziTg3c3k7vy060CTySz7C0TnyPRU4xwYtyM4RaxUFvz3nyU0shnxU00EbtiRb/bvrjwzU3QvirjrjTU3zitrNjTjSzrphBnCr6zSxzD3PM0NDBkw0MwzzzzzzzzzzzzU" ;任务完成
if (ok:=FindText(1479, 320, 1906, 984, 0, 0, Text))
{
Send {j Down} ;打开任务栏(我设置的位置是屏幕左下角)
Sleep 200
Send {j Up}
Sleep 200
Send {Alt Down}
Sleep 700
CoordMode, Mouse
X:=ok.1.x, Y:=ok.1.y, Comment:=ok.1.id
Click, %X%, %Y% ;点击任务完成
sleep 700
Text:="|<>*91$39.00Tzynznzzzq1yTzzyrzlzzz00y7U080DnC03mxyRzzwrDnzzzCvyTzznqTnzzzy7yTzzw3w" ;下一步
if (ok:=FindText(1484, 946, 1585, 994, 0, 0, Text))
{
CoordMode, Mouse
X:=ok.1.x, Y:=ok.1.y, Comment:=ok.1.id
Click, %X%, %Y%,7
}
sleep 500
MouseMove 1704,784 ;选择神秘水碎片
sleep 200
Click
Sleep 500
Send {Alt Up}
Sleep 200
Send {f Down} ;最后一次F完成任务
Sleep 200
Send {f Up}
Sleep 500
Text:="|<>*70$48.xzzVxrrDwzU7xtk0yTyzU5rzyTU1xrY1wjzTxr7zxjzT01I1tjU0xwrzvrzTxwo1rvzTxxpxbtzTxVpxDwsTxzo1U|<>*119$48.zzzzzzzzxzzVxrrDwzU7xtk0yTyzU5oNyTU1xrY1wDzTxr7zxjzT0141tbU0xwrzvrzTxwo1rvzTxxpxbtzTxVpxDwsTxzo1zzzzzzzzU"
;入手书信
if (ok:=FindText(215-150000, 281-150000, 215+150000, 281+150000, 0, 0, Text))
{
Send {Alt Down}
Sleep 500
CoordMode, Mouse
X:=ok.1.x+30, Y:=ok.1.y, Comment:=ok.1.id
Click, %X%, %Y%
Sleep 500
Send {Alt Up}
}
Sleep 200
Text:="|<>*101$46.A3gX03RxE80c0Ak5ilIyryRIX4303oYDyYhhgsp0V2qqy0Jv83LPnkEAEAQAU/znHryqy9PF3TvPtYVEA09U8|<>*92$47.g7gXzzRycq8K06M5PgJDhzbOYMUM0SYkzuqqqnXe127hhw1Lv83LPnm8686C7E6zwoxzhjdPMUPzPTLP50k0a0k|<>*82$46.U7c7zzzz0wwTzzzy7nrzzzz0201zzzw0+yzzzzrCv3zzzz0387zzzxzeUDzzzk0uezzzzvvefzzzyA807zzznzzzzzzzU" ;勇猛/净化任务接取
if (ok:=FindText(125-150000, 367-150000, 125+150000, 367+150000, 0, 0, Text))
{
Send {Alt Down}
Sleep 200
CoordMode, Mouse
X:=ok.1.x+180, Y:=ok.1.y, Comment:=ok.1.id
Click, %X%, %Y%
Sleep 700
Text:="|<>*91$39.00Tzynznzzzq1yTzzyrzlzzz00y7U080DnC03mxyRzzwrDnzzzCvyTzznqTnzzzy7yTzzw3w|<>*88$39.zzzzzrs03zzqTyTzzykDnzzzqzyDzzk07kw0101yNk0SLjnbzzatyTzztrTnzzySnyTzzzkznzzzUTU"
;下一步
if (ok:=FindText(1484, 946, 1585, 994, 0, 0, Text))
{
CoordMode, Mouse
X:=ok.1.x, Y:=ok.1.y, Comment:=ok.1.id
Click, %X%, %Y%,10
}
Sleep 500
Send {f Down}
Sleep 200
Send {f Up}
Sleep 500
Send {Alt Up}
}
}
Else
{
Text:="|<>*138$23.jTy7E60grSrNixou0E0njjx81k3PjjSqTVxkz3mCEsk" ;组队接受选项
if (ok:=FindText(1451-150000, 975-150000, 1451+150000, 975+150000, 0, 0, Text))
{
SendInput y
}
Text:="|<>*106$36.zzzzvzzzzzvzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaw1UB1qxjxxJaxjxx1qN1bBjpRhrNXZRhsxVvhhkRHro0DY0U" ;申请加入队伍
if (ok:=FindText(1654-150000, 1062-150000, 1654+150000, 1062+150000, 0, 0, Text))
{
Send {j Down}
Sleep 200
Send {j Up}
Sleep 200
Send {Alt Down}
Sleep 500
CoordMode, Mouse
X:=ok.1.x, Y:=ok.1.y-20, Comment:=ok.1.id
Click, %X%, %Y%
Sleep 500
Text:="|<>*134$46.zzzzzzzzwzvyzzTznzY0C0900DTjs4AwwzU3zNnnnzvw00DD8E0Tlw00xTzyTnnnb0TU7DDCNwszAwwtU23yk03aTDU3zDyE0y0Dwzs7nvyznzWwTU3zDzPlzzy" ;申请者目录
if (ok:=FindText(744-150000, 24-150000, 744+150000, 24+150000, 0, 0, Text))
{
CoordMode, Mouse
X:=ok.1.x+269, Y:=ok.1.y+85, Comment:=ok.1.id
Click, %X%, %Y%
}
Sleep 500
Send {Alt Up}
}
Text:="|<>*115$46.jC0zyzU6sQUBPwz1ArKl0rwc11P5HDmzxphBC0PzrExezzU31bmf20rhqQIhffSq9wqqihv1PqvOMkDnbKQA8" ;捡取物品
if (ok:=FindText(1121, 660, 1190, 739, 0, 0, Text))
{
SendInput {f Down}
Sleep 200
SendInput {f Up}
Sleep 200
SendInput {f Down}
Sleep 200
SendInput {f Up}
}
Sleep 200
SendInput,%gk%
}
}
}
Return
dkrwl:
If xz =1
{
SendInput {left Down}
}
If xz =0
{
}
Text:="|<>*138$23.jTy7E60grSrNixou0E0njjx81k3PjjSqTVxkz3mCEsk" ;组队接受选项
if (ok:=FindText(1451-150000, 975-150000, 1451+150000, 975+150000, 0, 0, Text))
{
SendInput y
}
Text:="|<>*106$36.zzzzvzzzzzvzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaw1UB1qxjxxJaxjxx1qN1bBjpRhrNXZRhsxVvhhkRHro0DY0U" ;申请加入队伍
if (ok:=FindText(1654-150000, 1062-150000, 1654+150000, 1062+150000, 0, 0, Text))
{
Send {j Down}
Sleep 200
Send {j Up}
Sleep 200
Send {Alt Down}
sleep 500
CoordMode, Mouse
X:=ok.1.x, Y:=ok.1.y-20, Comment:=ok.1.id
Click, %X%, %Y%
Sleep 500
Text:="|<>*134$46.zzzzzzzzwzvyzzTznzY0C0900DTjs4AwwzU3zNnnnzvw00DD8E0Tlw00xTzyTnnnb0TU7DDCNwszAwwtU23yk03aTDU3zDyE0y0Dwzs7nvyznzWwTU3zDzPlzzy" ;申请者目录
if (ok:=FindText(744-150000, 24-150000, 744+150000, 24+150000, 0, 0, Text))
{
CoordMode, Mouse
X:=ok.1.x+269, Y:=ok.1.y+85, Comment:=ok.1.id
Click, %X%, %Y%
}
Sleep 500
Send {Alt Up}
}
Send {j Down}
Sleep 200
Send {j Up}
Sleep 700
Text:="|<>*70$48.xzzVxrrDwzU7xtk0yTyzU5rzyTU1xrY1wjzTxr7zxjzT01I1tjU0xwrzvrzTxwo1rvzTxxpxbtzTxVpxDwsTxzo1U|<>*119$48.zzzzzzzzxzzVxrrDwzU7xtk0yTyzU5oNyTU1xrY1wDzTxr7zxjzT0141tbU0xwrzvrzTxwo1rvzTxxpxbtzTxVpxDwsTxzo1zzzzzzzzU"
;入手书信
if (ok:=FindText(215-150000, 281-150000, 215+150000, 281+150000, 0, 0, Text))
{
Send {Alt Down}
CoordMode, Mouse
X:=ok.1.x+30, Y:=ok.1.y, Comment:=ok.1.id
Click, %X%, %Y%
Send {Alt Up}
}
Sleep 500
Text:="|<>*101$46.A3gX03RxE80c0Ak5ilIyryRIX4303oYDyYhhgsp0V2qqy0Jv83LPnkEAEAQAU/znHryqy9PF3TvPtYVEA09U8|<>*92$47.g7gXzzRycq8K06M5PgJDhzbOYMUM0SYkzuqqqnXe127hhw1Lv83LPnm8686C7E6zwoxzhjdPMUPzPTLP50k0a0k|<>*82$46.U7c7zzzz0wwTzzzy7nrzzzz0201zzzw0+yzzzzrCv3zzzz0387zzzxzeUDzzzk0uezzzzvvefzzzyA807zzznzzzzzzzU" ;勇猛/净化任务接取
if (ok:=FindText(125-150000, 367-150000, 125+150000, 367+150000, 0, 0, Text))
{
Send {Alt Down}
CoordMode, Mouse
X:=ok.1.x+180, Y:=ok.1.y, Comment:=ok.1.id
Click, %X%, %Y%
Sleep 500
Text:="|<>*91$39.00Tzynznzzzq1yTzzyrzlzzz00y7U080DnC03mxyRzzwrDnzzzCvyTzznqTnzzzy7yTzzw3w|<>*88$39.zzzzzrs03zzqTyTzzykDnzzzqzyDzzk07kw0101yNk0SLjnbzzatyTzztrTnzzySnyTzzzkznzzzUTU" ;下一步
if (ok:=FindText(1484, 946, 1585, 994, 0, 0, Text))
{
CoordMode, Mouse
X:=ok.1.x, Y:=ok.1.y, Comment:=ok.1.id
Click, %X%, %Y%,10
}
Sleep 500
Send {f Down}
Sleep 200
Send {f Up}
Sleep 500
Send {Alt Up}
}
Else
{
Text:="|<>*138$23.jTy7E60grSrNixou0E0njjx81k3PjjSqTVxkz3mCEsk" ;组队接受选项
if (ok:=FindText(1451-150000, 975-150000, 1451+150000, 975+150000, 0, 0, Text))
{
SendInput y
}
Text:="|<>*106$36.zzzzvzzzzzvzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaw1UB1qxjxxJaxjxx1qN1bBjpRhrNXZRhsxVvhhkRHro0DY0U" ;申请加入队伍
if (ok:=FindText(1654-150000, 1062-150000, 1654+150000, 1062+150000, 0, 0, Text))
{
Send {j Down}
Sleep 200
Send {j Up}
Sleep 200
Send {Alt Down}
Sleep 500
CoordMode, Mouse
X:=ok.1.x, Y:=ok.1.y-20, Comment:=ok.1.id
Click, %X%, %Y%
Sleep 500
Text:="|<>*134$46.zzzzzzzzwzvyzzTznzY0C0900DTjs4AwwzU3zNnnnzvw00DD8E0Tlw00xTzyTnnnb0TU7DDCNwszAwwtU23yk03aTDU3zDyE0y0Dwzs7nvyznzWwTU3zDzPlzzy" ;申请者目录
if (ok:=FindText(744-150000, 24-150000, 744+150000, 24+150000, 0, 0, Text))
{
CoordMode, Mouse
X:=ok.1.x+269, Y:=ok.1.y+85, Comment:=ok.1.id
Click, %X%, %Y%
}
Sleep 500
Send {Alt Up}
}
Text:="|<>*115$46.jC0zyzU6sQUBPwz1ArKl0rwc11P5HDmzxphBC0PzrExezzU31bmf20rhqQIhffSq9wqqihv1PqvOMkDnbKQA8" ;捡取物品
if (ok:=FindText(1121, 660, 1190, 739, 0, 0, Text))
{
SendInput {f Down}
Sleep 200
SendInput {f Up}
Sleep 200
SendInput {f Down}
Sleep 200
SendInput {f Up}
}
Sleep 200
SendInput,%gk% ;此处释放TAB是为了防止怪没识别到导致被怪击杀,也能防止完成任务或者接取任务被怪打到导致出BUG
}
Return
jsqks: ;计时器
jsq+=1
If(jsq=30)
{
jsq=0
SetTimer dkrwl,-100
SetTimer jsqks,Off
}
Return
GuiClose:
F12::
MsgBox,已关闭脚本
If xz =1
{
SendInput {left Up}
Sleep 200
}
If xz =0
{
}
ExitApp
Return
;===== Copy The Following Functions To Your Own Code Just once =====
;--------------------------------
; FindText - 屏幕找字函数
;--------------------------------
; 返回变量 := FindText(
; X1 --> 查找范围的左上角X坐标
; , Y1 --> 查找范围的左上角Y坐标
; , X2 --> 查找范围的右下角X坐标
; , Y2 --> 查找范围的右下角Y坐标
; , err1 --> 文字的黑点容错百分率(0.1=10%)
; , err0 --> 背景的白点容错百分率(0.1=10%)
; , Text --> 由工具生成的查找图像的数据,可以一次查找多个,用“|”分隔
; , ScreenShot --> 是否截屏,为0则使用上一次的截屏数据
; , FindAll --> 是否搜索所有位置,为0则找到一个位置就返回
; , JoinText --> 是否组合图像,为1则多个数据组合为一幅图来查找
; , offsetX --> 组合图像的每个字和前一个字的最大横向间隔
; , offsetY --> 组合图像的每个字和第一个字的最大高低间隔
; )
; 返回变量 --> 如果没找到结果会返回0。否则返回一个二级数组,
; 第一级是每个结果对象,第二级是结果对象的具体信息数组:
; { 1:左上角X, 2:左上角Y, 3:图像宽度W, 4:图像高度H
; , x:中心点X, y:中心点Y, id:图像识别文本 }
; 坐标都是相对于屏幕,颜色使用RGB格式,组合查找必须使用统一的颜色模式
;--------------------------------
FindText( x1, y1, x2, y2, err1, err0, text, ScreenShot:=1
, FindAll:=1, JoinText:=0, offsetX:=20, offsetY:=10 )
{
local ; 避免超级全局变量的影响
bch:=A_BatchLines
SetBatchLines, -1
x:=(x1<x2 ? x1:x2), y:=(y1<y2 ? y1:y2)
, w:=Abs(x2-x1)+1, h:=Abs(y2-y1)+1
, xywh2xywh(x,y,w,h,x,y,w,h,zx,zy,zw,zh)
if (w<1 or h<1)
{
SetBatchLines, %bch%
return, 0
}
bits:=GetBitsFromScreen(x,y,w,h,ScreenShot,zx,zy,zw,zh)
sx:=x-zx, sy:=y-zy, sw:=w, sh:=h, arr:=[], info:=[]
Loop, Parse, text, |
if IsObject(j:=PicInfo(A_LoopField))
info.Push(j)
if (!(num:=info.MaxIndex()) or !bits.1)
{
SetBatchLines, %bch%
return, 0
}
VarSetCapacity(input, num*7*4), k:=0
Loop, % num
k+=Round(info[A_Index].2 * info[A_Index].3)
VarSetCapacity(s1, k*4), VarSetCapacity(s0, k*4)
, VarSetCapacity(gs, sw*sh), VarSetCapacity(ss, sw*sh)
, allpos_max:=(FindAll ? 1024 : 1)
, VarSetCapacity(allpos, allpos_max*4)
Loop, 2
{
if (err1=0 and err0=0) and (num>1 or A_Index>1)
err1:=0.1, err0:=0.05
if (JoinText)
{
j:=info[1], mode:=j.8, color:=j.9, n:=j.10
, w1:=-1, h1:=j.3, comment:="", v:="", i:=0
Loop, % num
{
j:=info[A_Index], w1+=j.2+1, comment.=j.11
Loop, 7
NumPut((A_Index=1 ? StrLen(v)
: A_Index=6 and err1 and !j.12 ? Round(j.4*err1)
: A_Index=7 and err0 and !j.12 ? Round(j.5*err0)
: j[A_Index]), input, 4*(i++), "int")
v.=j.1
}
ok:=PicFind( mode,color,n,offsetX,offsetY
, bits,sx,sy,sw,sh,gs,ss,v,s1,s0
, input,num*7,allpos,allpos_max )
Loop, % ok
pos:=NumGet(allpos, 4*(A_Index-1), "uint")
, rx:=(pos&0xFFFF)+zx, ry:=(pos>>16)+zy
, arr.Push( {1:rx, 2:ry, 3:w1, 4:h1
, x:rx+w1//2, y:ry+h1//2, id:comment} )
}
else
{
For i,j in info
{
mode:=j.8, color:=j.9, n:=j.10, comment:=j.11
, w1:=j.2, h1:=j.3, v:=j.1
Loop, 7
NumPut((A_Index=1 ? 0
: A_Index=6 and err1 and !j.12 ? Round(j.4*err1)
: A_Index=7 and err0 and !j.12 ? Round(j.5*err0)
: j[A_Index]), input, 4*(A_Index-1), "int")
ok:=PicFind( mode,color,n,offsetX,offsetY
, bits,sx,sy,sw,sh,gs,ss,v,s1,s0
, input,7,allpos,allpos_max )
Loop, % ok
pos:=NumGet(allpos, 4*(A_Index-1), "uint")
, rx:=(pos&0xFFFF)+zx, ry:=(pos>>16)+zy
, arr.Push( {1:rx, 2:ry, 3:w1, 4:h1
, x:rx+w1//2, y:ry+h1//2, id:comment} )
if (ok and !FindAll)
Break
}
}
if (err1=0 and err0=0 and num=1 and !arr.MaxIndex())
{
k:=0
For i,j in info
k+=(!j.12)
IfEqual, k, 0, Break
}
else Break
}
SetBatchLines, %bch%
return, arr.MaxIndex() ? arr:0
}
; 绑定窗口从而可以后台查找这个窗口的图像
; 相当于始终在前台。解绑窗口使用 Bindwindow(0)
BindWindow(window_id:=0, set_exstyle:=0, get:=0)
{
static id, old, Ptr:=A_PtrSize ? "UPtr" : "UInt"
if (get)
return, id
if (window_id)
{
id:=window_id, old:=0
if (set_exstyle)
{
WinGet, old, ExStyle, ahk_id %id%
WinSet, Transparent, 255, ahk_id %id%
Loop, 30
{
Sleep, 100
WinGet, i, Transparent, ahk_id %id%
}
Until (i=255)
}
}
else
{
if (old)
WinSet, ExStyle, %old%, ahk_id %id%
id:=old:=0
}
}
xywh2xywh(x1,y1,w1,h1, ByRef x,ByRef y,ByRef w,ByRef h
, ByRef zx:="", ByRef zy:="", ByRef zw:="", ByRef zh:="")
{
SysGet, zx, 76
SysGet, zy, 77
SysGet, zw, 78
SysGet, zh, 79
left:=x1, right:=x1+w1-1, up:=y1, down:=y1+h1-1
left:=left<zx ? zx:left, right:=right>zx+zw-1 ? zx+zw-1:right
up:=up<zy ? zy:up, down:=down>zy+zh-1 ? zy+zh-1:down
x:=left, y:=up, w:=right-left+1, h:=down-up+1
}
GetBitsFromScreen(x, y, w, h, ScreenShot:=1
, ByRef zx:="", ByRef zy:="", ByRef zw:="", ByRef zh:="")
{
local ; 避免超级全局变量的影响
static hBM, oldzx, oldzy, oldzw, oldzh, bits:=[]
static Ptr:=A_PtrSize ? "UPtr" : "UInt"
static init:=!GetBitsFromScreen(0,0,0,0,1)
if (!ScreenShot)
{
zx:=oldzx, zy:=oldzy, zw:=oldzw, zh:=oldzh
return, bits
}
bch:=A_BatchLines, cri:=A_IsCritical
Critical
if (zw<1 or zh<1)
{
SysGet, zx, 76
SysGet, zy, 77
SysGet, zw, 78
SysGet, zh, 79
}
if (zw>oldzw or zh>oldzh or !hBM)
{
DllCall("DeleteObject", Ptr,hBM), hBM:="", bpp:=32
VarSetCapacity(bi, 40, 0), NumPut(40, bi, 0, "int")
NumPut(zw, bi, 4, "int"), NumPut(-zh, bi, 8, "int")
NumPut(1, bi, 12, "short"), NumPut(bpp, bi, 14, "short")
hBM:=DllCall("CreateDIBSection", Ptr,0, Ptr,&bi
, "int",0, Ptr "*",ppvBits, Ptr,0, "int",0, Ptr)
Scan0:=(!hBM ? 0:ppvBits), Stride:=((zw*bpp+31)//32)*4
bits.1:=Scan0, bits.2:=Stride
oldzx:=zx, oldzy:=zy, oldzw:=zw, oldzh:=zh
x:=zx, y:=zy, w:=zw, h:=zh
}
if (hBM) and !(w<1 or h<1)
{
win:=DllCall("GetDesktopWindow", Ptr)
hDC:=DllCall("GetWindowDC", Ptr,win, Ptr)
mDC:=DllCall("CreateCompatibleDC", Ptr,hDC, Ptr)
oBM:=DllCall("SelectObject", Ptr,mDC, Ptr,hBM, Ptr)
DllCall("BitBlt",Ptr,mDC,"int",x-zx,"int",y-zy,"int",w,"int",h
, Ptr,hDC, "int",x, "int",y, "uint",0x00CC0020|0x40000000)
DllCall("ReleaseDC", Ptr,win, Ptr,hDC)
if (id:=BindWindow(0,0,1))
WinGet, id, ID, ahk_id %id%
if (id)
{
WinGetPos, wx, wy, ww, wh, ahk_id %id%
left:=x, right:=x+w-1, up:=y, down:=y+h-1
left:=left<wx ? wx:left, right:=right>wx+ww-1 ? wx+ww-1:right
up:=up<wy ? wy:up, down:=down>wy+wh-1 ? wy+wh-1:down
x:=left, y:=up, w:=right-left+1, h:=down-up+1
}
if (id) and !(w<1 or h<1)
{
hDC2:=DllCall("GetDCEx", Ptr,id, Ptr,0, "int",3, Ptr)
DllCall("BitBlt",Ptr,mDC,"int",x-zx,"int",y-zy,"int",w,"int",h
, Ptr,hDC2, "int",x-wx, "int",y-wy, "uint",0x00CC0020|0x40000000)
DllCall("ReleaseDC", Ptr,id, Ptr,hDC2)
}
DllCall("SelectObject", Ptr,mDC, Ptr,oBM)
DllCall("DeleteDC", Ptr,mDC)
}
Critical, %cri%
SetBatchLines, %bch%
return, bits
}
PicInfo(text)
{
static info:=[]
IfNotInString, text, $, return
if (info[text])
return, info[text]
v:=text, comment:="", e1:=e0:=0, set_e1_e0:=0
; You Can Add Comment Text within The <>
if RegExMatch(v,"<([^>]*)>",r)
v:=StrReplace(v,r), comment:=Trim(r1)
; You can Add two fault-tolerant in the [], separated by commas
if RegExMatch(v,"\[([^\]]*)]",r)
{
v:=StrReplace(v,r), r1.=","
StringSplit, r, r1, `,
e1:=r1, e0:=r2, set_e1_e0:=1
}
StringSplit, r, v, $
color:=r1, v:=r2 "."
StringSplit, r, v, .
w1:=r1, v:=base64tobit(r2), h1:=StrLen(v)//w1
if (w1<1 or h1<1 or StrLen(v)!=w1*h1)
return
mode:=InStr(color,"-") ? 4 : InStr(color,"#") ? 3
: InStr(color,"**") ? 2 : InStr(color,"*") ? 1 : 0
if (mode=4)
{
color:=StrReplace(color,"0x")
StringSplit, r, color, -
color:="0x" . r1, n:="0x" . r2
}
else
{
color:=RegExReplace(color,"[*#]") . "@"
StringSplit, r, color, @
color:=r1, n:=Round(r2,2)+(!r2)
, n:=Floor(9*255*255*(1-n)*(1-n))
}
StrReplace(v,"1","",len1), len0:=StrLen(v)-len1
, e1:=Round(len1*e1), e0:=Round(len0*e0)
return, info[text]:=[v,w1,h1,len1,len0,e1,e0
, mode,color,n,comment,set_e1_e0]
}
PicFind(mode, color, n, offsetX, offsetY
, bits, sx, sy, sw, sh
, ByRef gs, ByRef ss, ByRef text, ByRef s1, ByRef s0
, ByRef input, num, ByRef allpos, allpos_max)
{
static MyFunc, Ptr:=A_PtrSize ? "UPtr" : "UInt"
if (!MyFunc)
{
x32:="5557565383EC788B8424CC0000008BBC24CC000000C7442"
. "424000000008B40048B7F148944243C8B8424CC000000897C2"
. "42C8BBC24CC0000008B40088B7F18894424388B8424CC00000"
. "0897C24308B400C89C6894424288B8424CC0000008B401039C"
. "6894424200F4DC68944241C8B8424D000000085C00F8E15010"
. "0008BB424CC0000008B44242489F78B0C868B7486048B44870"
. "88974241085C0894424180F8ED700000089CD894C2414C7442"
. "40C00000000C744240800000000C744240400000000890C248"
. "D76008DBC27000000008B5C24108B7424088B4C24148B54240"
. "C89DF89F029F101F78BB424C000000001CE85DB7E5E8B0C248"
. "9EB893C2489D7EB198BAC24C800000083C70483C00189548D0"
. "083C101390424742C83BC248C0000000389FA0F45D0803C063"
. "175D48BAC24C400000083C70483C00189549D0083C30139042"
. "475D48B7424100174241489DD890C2483442404018BB424B00"
. "000008B442404017424088BBC24A4000000017C240C3944241"
. "80F8554FFFFFF83442424078B442424398424D00000000F8FE"
. "BFEFFFF83BC248C000000030F84A00600008B8424A40000008"
. "BB424A80000000FAF8424AC0000008BBC24A40000008D2CB08"
. "B8424B0000000F7D88D04878BBC248C0000008944241085FF0"
. "F84F702000083BC248C000000010F847F08000083BC248C000"
. "000020F84330900008B8424900000008B9C24940000000FB6B"
. "C24940000000FB6B42490000000C744241800000000C744242"
. "400000000C1E8100FB6DF0FB6D08B84249000000089D10FB6C"
. "4894424088B842494000000C1E8100FB6C029C101D08904248"
. "B442408894C24408B4C240801D829D9894424088D043E894C2"
. "40489F129F9894424148BBC24B40000008B8424B0000000894"
. "C240C89E98B6C2440C1E00285FF894424340F8EBA0000008BB"
. "424B000000085F60F8E910000008B8424A00000008B5424240"
. "39424BC00000001C8034C243489CF894C244003BC24A000000"
. "0EB3D8D76008DBC2700000000391C247C3D394C24047F37394"
. "C24087C3189F30FB6F33974240C0F9EC3397424140F9DC183C"
. "00483C20121D9884AFF39F8741E0FB658020FB648010FB6303"
. "9DD7EBE31C983C00483C201884AFF39F875E28BB424B000000"
. "0017424248B4C24408344241801034C24108B442418398424B"
. "40000000F8546FFFFFF8B8424B00000002B44243C8944240C8"
. "B8424B40000002B442438894424600F886D0900008B4424288"
. "BBC24C40000008B74243CC744241000000000C744243800000"
. "000C7442434000000008D3C8789C583EE01897C246C8974247"
. "48B44240C85C00F88E70000008B7C24388B8424AC000000BE0"
. "0000000C704240000000001F8C1E0108944246889F82B84249"
. "C0000000F49F08B84249C000000897424640FAFB424B000000"
. "001F8894424708974245C8DB6000000008B04240344241089C"
. "1894424088B442430394424200F84AA0100008B5C241C89C60"
. "38C24BC00000031C08B54242C85DB0F8EC8010000897424048"
. "B7C2420EB2D39C77E1C8BB424C80000008B1C8601CB803B007"
. "40B836C240401782B8D74260083C0013944241C0F849101000"
. "039C57ECF8BB424C40000008B1C8601CB803B0174BE83EA017"
. "9B9830424018B04243944240C0F8D68FFFFFF83442438018BB"
. "424B00000008B44243801742410394424600F8DEFFEFFFF8B4"
. "C243483C47889C85B5E5F5DC250008B8424900000008BB424B"
. "4000000C744240C00000000C744241400000000C1E8100FB6C"
. "08904248B8424900000000FB6C4894424040FB684249000000"
. "0894424088B8424B0000000C1E00285F68944242489E88BAC2"
. "4940000000F8E24FEFFFF8B9C24B000000085DB7E758B9C24A"
. "00000008B7424148BBC24A000000003B424BC00000001C3034"
. "424248944241801C78D76008DBC27000000000FB643020FB64"
. "B012B04242B4C24040FB6132B5424080FAFC00FAFC98D04400"
. "FAFD28D04888D045039C50F930683C30483C60139DF75C98BB"
. "C24B0000000017C24148B4424188344240C01034424108B742"
. "40C39B424B40000000F8566FFFFFFE985FDFFFF85ED7E358B7"
. "424088BBC24BC00000031C08B54242C8D1C378BB424C400000"
. "08B0C8601D9803901740983EA010F8890FEFFFF83C00139C57"
. "5E683BC24D0000000070F8EAA0100008B442474030424C7442"
. "44007000000896C2444894424288B8424CC00000083C020894"
. "4243C8B44243C8B9424B00000008B7C24288B0029C28944245"
. "08B84249800000001F839C20F4EC289C68944244C39FE0F8C0"
. "90100008B44243C8B700C8B78108B6808897424148B7014897"
. "C242489C7897424548BB424B40000002B700489F08B7424703"
. "9C60F4EC68BB424C4000000894424188B47FC89442404C1E00"
. "201C6038424C8000000894424588B4424648B7C2428037C245"
. "C3B442418894424040F8F8700000085ED7E268B8C24BC00000"
. "08B54242431C08D1C398B0C8601D9803901740583EA01784A8"
. "3C00139C575EA8B4424148B4C245439C8747E85C07E7A8B9C2"
. "4BC000000896C244831C08B6C245801FBEB0983C0013944241"
. "4745C8B54850001DA803A0074EC83E90179E78B6C244890834"
. "424040103BC24B00000008B442404394424180F8D79FFFFFF8"
. "3442428018B4424283944244C0F8D4CFFFFFF830424018B6C2"
. "4448B04243944240C0F8D7EFCFFFFE911FDFFFF8B4424288B7"
. "C245083442440078344243C1C8D4438FF894424288B4424403"
. "98424D00000000F8F7FFEFFFF8B6C24448B7C24348B0424038"
. "424A80000008BB424D40000000B4424688D4F01398C24D8000"
. "0008904BE0F8ED8FCFFFF85ED7E278B7424088BBC24BC00000"
. "08B8424C40000008D1C378B74246C8B1083C00401DA39F0C60"
. "20075F283042401894C24348B04243944240C0F8DDEFBFFFFE"
. "971FCFFFF89F68DBC27000000008B74243C8B8424900000003"
. "1D2F7F60FAF8424A40000008D0490894424188B8424B000000"
. "0038424A800000029F0894424348B8424AC000000038424B40"
. "000002B442438398424AC0000008944243C0F8F560400008B8"
. "424A40000008BB424A80000000FAF8424AC000000C74424240"
. "00000008D04B0034424188BB424A0000000894424388B44243"
. "4398424A80000000F8F320100008B8424AC000000C1E010894"
. "424408B442438894424148B8424A8000000894424088B44241"
. "40FB67C060289C52B6C2418893C240FB67C0601897C24040FB"
. "63C068B44241C85C00F8E1E0100008B442430894424108B442"
. "42C8944240C31C0EB678D76008DBC2700000000394424207E4"
. "A8B9C24C80000008B0C8301E90FB6540E020FB65C0E012B142"
. "42B5C24040FB60C0E0FAFD20FAFDB29F98D14520FAFC98D149"
. "A8D144A39942494000000720C836C2410017865908D7426008"
. "3C0013944241C0F84A3000000394424287E9D8B9C24C400000"
. "08B0C8301E90FB6540E020FB65C0E012B14242B5C24040FB60"
. "C0E0FAFD20FAFDB29F98D14520FAFC98D149A8D144A3B94249"
. "40000000F865BFFFFFF836C240C010F8950FFFFFF834424080"
. "183442414048B442408394424340F8DEFFEFFFF838424AC000"
. "000018BBC24A40000008B44243C017C24383B8424AC0000000"
. "F8D99FEFFFF8B4C242483C4785B5E89C85F5DC250008D74260"
. "08B7C24248B4424400B4424088B9C24D40000008D4F013B8C2"
. "4D80000008904BB0F8D64FAFFFF894C2424EB848B842490000"
. "0008B8C24B4000000C7042400000000C74424040000000083C"
. "001C1E00789C68B8424B0000000C1E00285C98944240889E88"
. "9F50F8EAFF8FFFF8B9424B000000085D27E5F8B8C24A000000"
. "08B5C2404039C24BC00000001C1034424088944240C038424A"
. "000000089C70FB651020FB641010FB6316BC04B6BD22601C28"
. "9F0C1E00429F001D039C50F970383C10483C30139F975D58BB"
. "424B0000000017424048B44240C83042401034424108B34243"
. "9B424B40000007582E92CF8FFFF8B8424B0000000C70424000"
. "00000C744240400000000C1E002894424088B8424B40000008"
. "5C00F8E920000008B8424B000000085C07E6F8B8C24A000000"
. "08B5C24048BB424B800000001E9036C240801DE039C24BC000"
. "000896C240C03AC24A00000000FB651020FB6410183C1040FB"
. "679FC83C60183C3016BC04B6BD22601C289F8C1E00429F801D"
. "0C1F8078846FFC643FF0039CD75CC8BBC24B0000000017C240"
. "48B6C240C83042401036C24108B0424398424B40000000F856"
. "EFFFFFF83BC24B4000000020F8E60F7FFFF8B8424BC0000000"
. "38424B00000008BAC24B800000003AC24B0000000C74424040"
. "1000000894424088B8424B400000083E8018944240C8B8424B"
. "000000083C0018944241083BC24B0000000027E798B4424108"
. "9E92B8C24B00000008B5C240889EA8D34288D45FE8904240FB"
. "642010FB63A0384249000000039F87C360FB67A0239F87C2E0"
. "FB6790139F87C260FB63E39F87C1F0FB63939F87C180FB6790"
. "239F87C100FB67EFF39F87C080FB67E0139F87D04C64301018"
. "3C20183C30183C10183C6013B0C2475A3834424040103AC24B"
. "00000008B4424048BBC24B0000000017C24083944240C0F855"
. "8FFFFFFE96FF6FFFF83C47831C95B89C85E5F5DC2500090909"
. "090909090"
x64:="4157415641554154555756534881EC88000000488B84245"
. "0010000488BB42450010000448B94245801000089542428448"
. "944240844898C24E80000008B40048B76144C8BBC244001000"
. "04C8BB42448010000C74424180000000089442430488B84245"
. "00100008974241C488BB424500100008B40088B76188944243"
. "C488B842450010000897424388B400C89C789442440488B842"
. "4500100008B401039C7894424100F4DC74585D289442454488"
. "B84245001000048894424200F8ECB000000488B442420448B0"
. "8448B68048B400885C0894424040F8E940000004489CE44890"
. "C244531E431FF31ED0F1F8400000000004585ED7E614863142"
. "4418D5C3D0089F848039424380100004589E0EB1D0F1F0083C"
. "0014D63D94183C0044183C1014883C20139C34789149E74288"
. "3F9034589C2440F45D0803A3175D783C0014C63DE4183C0048"
. "3C6014883C20139C34789149F75D844012C2483C50103BC241"
. "80100004403A42400010000396C24047582834424180748834"
. "424201C8B442418398424580100000F8F35FFFFFF83F9030F8"
. "43D0600008B8424000100008BBC24080100000FAF842410010"
. "0008BB424000100008D3CB88B842418010000F7D885C9448D2"
. "C860F841101000083F9010F844108000083F9020F84E008000"
. "08B742428C744240400000000C74424180000000089F0440FB"
. "6CEC1E8104589CC0FB6D84889F08B7424080FB6D44189DB89F"
. "0440FB6C64889F1C1E8100FB6CD89D60FB6C08D2C0A8B94242"
. "00100004129C301C3438D040129CE4529C48904248B8424180"
. "10000C1E00285D2894424080F8E660100004C89BC244001000"
. "0448BBC24180100004585FF0F8E91040000488B8C24F800000"
. "04863C74C6354241831D24C03942430010000488D440102EB3"
. "A0F1F80000000004439C37C4039CE7F3C39CD7C384539CC410"
. "F9EC044390C240F9DC14421C141880C124883C2014883C0044"
. "139D70F8E2D040000440FB6000FB648FF440FB648FE4539C37"
. "EBB31C9EBD58B5C2428448B8C242001000031ED4531E44889D"
. "84189DB0FB6DB0FB6F48B84241801000041C1EB10450FB6DBC"
. "1E0024585C98904240F8EA10000004C89BC24400100004C89B"
. "42448010000448B7C2408448BB424180100004585F67E60488"
. "B8C24F80000004D63D44C039424300100004863C74531C94C8"
. "D440102410FB600410FB648FF410FB650FE4429D829F10FAFC"
. "029DA0FAFC98D04400FAFD28D04888D04504139C7430F93040"
. "A4983C1014983C0044539CE7FC4033C244501F483C5014401E"
. "F39AC2420010000758C4C8BBC24400100004C8BB4244801000"
. "08B8424180100002B4424308904248B8424200100002B44243"
. "C894424680F88750800008B7C24404D89F5488BAC243001000"
. "0448B7424104C89FEC74424040000000048C74424280000000"
. "0C74424200000000089F883E801498D4487044189FF4889442"
. "4088B44243083E801894424788B042485C00F88D9000000488"
. "B5C24288B8424100100004D89EC448B6C245401D8C1E010894"
. "4247089D82B8424F000000089C7B8000000000F49C731FF894"
. "4246C0FAF842418010000894424648B8424F000000001D8894"
. "42474908B442404897C24188D1C388B4424384139C60F84AB0"
. "000004189C131C04585ED448B44241C7F36E9C30000000F1F4"
. "0004139CE7E1B418B148401DA4863D2807C150000740B4183E"
. "901782E0F1F4400004883C0014139C50F8E920000004139C78"
. "9C17ECC8B148601DA4863D2807C15000174BD4183E80179B74"
. "883C701393C240F8D7AFFFFFF4D89E54883442428018B9C241"
. "8010000488B442428015C2404394424680F8DFCFEFFFF8B4C2"
. "42089C84881C4880000005B5E5F5D415C415D415E415FC3458"
. "5FF7E278B4C241C4C8B4424084889F28B0201D84898807C050"
. "001740583E90178934883C2044939D075E583BC24580100000"
. "70F8EE60100008B442478488B8C24500100000344241844896"
. "C2450448BAC241801000044897C24404883C1204889742410C"
. "744243C07000000448974244448897C24484989CF895C247C8"
. "9C64C89642430418B074489EA29C28944245C8B8424E800000"
. "001F039C20F4EC239F0894424580F8CD0000000418B47148BB"
. "C2420010000412B7F0449635FFC458B4F08458B670C8944246"
. "08B442474458B771039C70F4FF8488B44241048C1E3024C8D1"
. "41848035C24308B442464448D04068B44246C39F84189C37F7"
. "2904585C97E234489F131D2418B04924401C04898807C05000"
. "1740583E90178464883C2014139D17FE28B4424604139C40F8"
. "4AA0000004585E40F8EA100000089C131D2EB0D4883C201413"
. "9D40F8E8E0000008B04934401C04898807C05000074E483E90"
. "179DF4183C3014501E84439DF7D8F83C601397424580F8D6EF"
. "FFFFF488B7C2448448B7C2440448B742444448B6C2450488B7"
. "424104C8B6424304883C701393C240F8D97FDFFFFE918FEFFF"
. "F6690037C240844017C241883442404014401EF8B442404398"
. "424200100000F854DFBFFFF4C8BBC2440010000E996FCFFFF8"
. "B44245C8344243C074983C71C8D7406FF8B44243C398424580"
. "100000F8F87FEFFFF448B7C2440448B742444448B6C2450488"
. "B7C24488B5C247C488B7424104C8B64243048634424208B542"
. "418039424080100004C8B9C24600100000B5424708D4801398"
. "C2468010000418914830F8E9AFDFFFF4585FF7E1D4C8B44240"
. "84889F08B104883C00401DA4C39C04863D2C64415000075EB4"
. "883C701393C24894C24200F8DBAFCFFFFE93BFDFFFF0F1F440"
. "0008B7C24308B44242831D2F7F70FAF8424000100008D04908"
. "94424208B8424180100000384240801000029F8894424308B8"
. "42410010000038424200100002B44243C39842410010000894"
. "424440F8F2B0400008B8424000100008BBC24080100000FAF8"
. "42410010000448B642440448B6C24544C8B8C24F8000000C74"
. "42428000000008D04B8034424208944243C8B4424303984240"
. "80100000F8F360100008B8424100100008B6C243CC1E010894"
. "424408B8424080100008904248D450289EF2B7C24204585ED4"
. "898450FB61C018D45014898410FB61C014863C5410FB634010"
. "F8E1C0100008B442438894424188B44241C8944240431C0EB6"
. "90F1F800000000044395424107E4E418B0C8601F98D5102448"
. "D41014863C9410FB60C094863D24D63C0410FB61411470FB60"
. "40129F10FAFC94429DA4129D80FAFD2450FAFC08D1452428D1"
. "4828D144A395424087207836C241801786B4883C0014139C50"
. "F8E9F0000004139C44189C27E96418B0C8701F98D5102448D4"
. "1014863C9410FB60C094863D24D63C0410FB61411470FB6040"
. "129F10FAFC94429DA4129D80FAFD2450FAFC08D1452428D148"
. "28D144A3B5424080F864BFFFFFF836C2404010F8940FFFFFF8"
. "304240183C5048B0424394424300F8DE6FEFFFF83842410010"
. "000018BBC24000100008B442444017C243C3B8424100100000"
. "F8D95FEFFFF8B4C2428E95CFBFFFF48634424288B5424400B1"
. "424488BBC24600100008D48013B8C24680100008914870F8D3"
. "5FBFFFF8304240183C504894C24288B0424394424300F8D7AF"
. "EFFFFEB92448B5C2428448B84242001000031DB8B842418010"
. "00031F6448B9424180100004183C30141C1E3074585C08D2C8"
. "5000000000F8E6BF9FFFF4585D27E57488B8C24F80000004C6"
. "3CE4C038C24300100004863C74531C0488D4C01020FB6110FB"
. "641FF440FB661FE6BC04B6BD22601C24489E0C1E0044429E00"
. "1D04139C3430F9704014983C0014883C1044539C27FCC01EF4"
. "401D683C3014401EF399C24200100007595E9FBF8FFFF8B8C2"
. "4200100008B84241801000031DB31F6448B8C241801000085C"
. "98D2C85000000007E7D4585C97E694C63C6488B8C24F800000"
. "04863C74D89C24C038424300100004C0394242801000031D24"
. "88D4C0102440FB6190FB641FF4883C104440FB661FA6BC04B4"
. "56BDB264101C34489E0C1E0044429E04401D8C1F8074188041"
. "241C60410004883C2014139D17FC401EF4401CE83C3014401E"
. "F399C2420010000758383BC2420010000020F8E4BF8FFFF486"
. "3B424180100008B9C24180100008BBC2420010000488D56014"
. "48D67FFBF010000004889D0480394243001000048038424280"
. "100004889D58D53FD4C8D6A0183BC241801000002488D1C067"
. "E7E4989C04D8D5C05004989D94929F04889E90FB610440FB65"
. "0FF035424284439D27C44440FB650014439D27C3A450FB6104"
. "439D27C31450FB6114439D27C28450FB650FF4439D27C1E450"
. "FB650014439D27C14450FB651FF4439D27C0A450FB65101443"
. "9D27D03C601014883C0014983C1014883C1014983C0014C39D"
. "8759383C7014801F54889D84139FC0F8562FFFFFFE968F7FFF"
. "F31C9E9D9F8FFFF909090909090909090909090"
MCode(MyFunc, A_PtrSize=8 ? x64:x32)
}
return, !bits.1 ? 0:DllCall(&MyFunc, "int",mode, "uint",color
, "uint",n, "int",offsetX, "int",offsetY, Ptr,bits.1
, "int",bits.2, "int",sx, "int",sy, "int",sw, "int",sh
, Ptr,&gs, Ptr,&ss, "AStr",text, Ptr,&s1, Ptr,&s0
, Ptr,&input, "int",num, Ptr,&allpos, "int",allpos_max)
}
MCode(ByRef code, hex)
{
bch:=A_BatchLines
SetBatchLines, -1
VarSetCapacity(code, len:=StrLen(hex)//2)
lls:=A_ListLines=0 ? "Off" : "On"
ListLines, Off
Loop, % len
NumPut("0x" SubStr(hex,2*A_Index-1,2),code,A_Index-1,"uchar")
ListLines, %lls%
Ptr:=A_PtrSize ? "UPtr" : "UInt", PtrP:=Ptr "*"
DllCall("VirtualProtect",Ptr,&code, Ptr,len,"uint",0x40,PtrP,0)
SetBatchLines, %bch%
}
base64tobit(s)
{
Chars:="0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZ"
. "abcdefghijklmnopqrstuvwxyz"
SetFormat, IntegerFast, d
StringCaseSense, On
lls:=A_ListLines=0 ? "Off" : "On"
ListLines, Off
Loop, Parse, Chars
{
i:=A_Index-1, v:=(i>>5&1) . (i>>4&1)
. (i>>3&1) . (i>>2&1) . (i>>1&1) . (i&1)
s:=StrReplace(s,A_LoopField,v)
}
ListLines, %lls%
StringCaseSense, Off
s:=SubStr(s,1,InStr(s,"1",0,0)-1)
s:=RegExReplace(s,"[^01]+")
return, s
}
bit2base64(s)
{
s:=RegExReplace(s,"[^01]+")
s.=SubStr("100000",1,6-Mod(StrLen(s),6))
s:=RegExReplace(s,".{6}","|$0")
Chars:="0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZ"
. "abcdefghijklmnopqrstuvwxyz"
SetFormat, IntegerFast, d
lls:=A_ListLines=0 ? "Off" : "On"
ListLines, Off
Loop, Parse, Chars
{
i:=A_Index-1, v:="|" . (i>>5&1) . (i>>4&1)
. (i>>3&1) . (i>>2&1) . (i>>1&1) . (i&1)
s:=StrReplace(s,v,A_LoopField)
}
ListLines, %lls%
return, s
}
ASCII(s)
{
if RegExMatch(s,"\$(\d+)\.([\w+/]+)",r)
{
s:=RegExReplace(base64tobit(r2),".{" r1 "}","$0`n")
s:=StrReplace(StrReplace(s,"0","_"),"1","0")
}
else s=
return, s
}
; 可以在脚本的开头用 PicLib(Text,1) 导入字库,
; 然后使用 PicLib("说明文字1|说明文字2|...") 获取字库中的数据
PicLib(comments, add_to_Lib:=0, index:=1)
{
static Lib:=[]
SetFormat, IntegerFast, d
if (add_to_Lib)
{
re:="<([^>]*)>[^$]+\$\d+\.[\w+/]+"
Loop, Parse, comments, |
if RegExMatch(A_LoopField,re,r)
{
s1:=Trim(r1), s2:=""
Loop, Parse, s1
s2.="_" . Ord(A_LoopField)
Lib[index,s2]:=r
}
Lib[index,""]:=""
}
else
{
Text:=""
Loop, Parse, comments, |
{
s1:=Trim(A_LoopField), s2:=""
Loop, Parse, s1
s2.="_" . Ord(A_LoopField)
Text.="|" . Lib[index,s2]
}
return, Text
}
}
PicN(Number, index:=1)
{
return, PicLib(RegExReplace(Number,".","|$0"), 0, index)
}
; 使用 PicX(Text) 可以将文字分割成多个单字的组合,从而适应间隔变化
; 但是不能用于“颜色位置二值化”模式, 因为位置是与整体图像相关的
PicX(Text)
{
if !RegExMatch(Text,"\|([^$]+)\$(\d+)\.([\w+/]+)",r)
return, Text
w:=r2, v:=base64tobit(r3), Text:=""
c:=StrLen(StrReplace(v,"0"))<=StrLen(v)//2 ? "1":"0"
wz:=RegExReplace(v,".{" w "}","$0`n")
SetFormat, IntegerFast, d
While InStr(wz,c)
{
While !(wz~="m`n)^" c)
wz:=RegExReplace(wz,"m`n)^.")
i:=0
While (wz~="m`n)^.{" i "}" c)
i++
v:=RegExReplace(wz,"m`n)^(.{" i "}).*","$1")
wz:=RegExReplace(wz,"m`n)^.{" i "}")
if (v!="")
Text.="|" r1 "$" i "." bit2base64(v)
}
return, Text
}
; 截屏,作为后续操作要用的“上一次的截屏”
ScreenShot(x1:="", y1:="", x2:="", y2:="")
{
if (x1+y1+x2+y2="")
n:=150000, x:=y:=-n, w:=h:=2*n
else
x:=(x1<x2 ? x1:x2), y:=(y1<y2 ? y1:y2)
, w:=Abs(x2-x1)+1, h:=Abs(y2-y1)+1
xywh2xywh(x,y,w,h,x,y,w,h,zx,zy,zw,zh)
GetBitsFromScreen(x,y,w,h,1,zx,zy,zw,zh)
}
; 从“上一次的截屏”中快速获取指定坐标的RGB颜色
; 如果坐标超出了屏幕范围,将返回白色
ScreenShot_GetColor(x,y)
{
bits:=GetBitsFromScreen(0,0,0,0,0,zx,zy,zw,zh)
return, (x<zx or x>zx+zw-1 or y<zy or y>zy+zh-1 or !bits.1)
? "0xFFFFFF" : Format("0x{:06X}",NumGet(bits.1
+(y-zy)*bits.2+(x-zx)*4,"uint")&0xFFFFFF)
}
; 根据 FindText() 的结果识别一行文字或验证码
; offsetX 为两个文字的最大间隔,超过会插入*号
; offsetY 为后续文字与第一个文字的最大高度差
; 最后返回数组:{ocr:识别结果, x:结果左上角X, y:结果左上角Y}
OcrOK(ok, offsetX:=20, offsetY:=20)
{
ocr_Text:=ocr_X:=ocr_Y:=min_X:=""
For k,v in ok
x:=v.1
, min_X:=(A_Index=1 or x<min_X ? x : min_X)
, max_X:=(A_Index=1 or x>max_X ? x : max_X)
While (min_X!="" and min_X<=max_X)
{
LeftX:=""
For k,v in ok
{
x:=v.1, y:=v.2, w:=v.3, h:=v.4
if (x<min_X) or Abs(y-ocr_Y)>offsetY
Continue
; Get the leftmost X coordinates
if (LeftX="" or x<LeftX)
LeftX:=x, LeftY:=y, LeftW:=w, LeftH:=h, LeftOCR:=v.id
else if (x=LeftX)
{
Loop, 100
{
err:=(A_Index-1)/100+0.000001
if FindText(LeftX,LeftY,LeftX+LeftW-1,LeftY+LeftH-1,err,err,Text,0)
Break
if FindText(x, y, x+w-1, y+h-1, err, err, Text, 0)
{
LeftX:=x, LeftY:=y, LeftW:=w, LeftH:=h, LeftOCR:=v.id
Break
}
}
}
}
if (ocr_X="")
ocr_X:=LeftX, ocr_Y:=LeftY
; If the interval exceeds the set value, add "*" to the result
ocr_Text.=(ocr_Text!="" and LeftX-min_X>offsetX ? "*":"") . LeftOCR
; Update min_X for next search
min_X:=LeftX+LeftW
}
return, {ocr:ocr_Text, x:ocr_X, y:ocr_Y}
}
; 按照从左到右、从上到下的顺序排序FindText()的结果
; 忽略轻微的Y坐标差距,返回排序后的数组对象
SortOK(ok, dy:=10)
{
if !IsObject(ok)
return, ok
SetFormat, IntegerFast, d
ypos:=[]
For k,v in ok
{
x:=v.x, y:=v.y, add:=1
For k2,v2 in ypos
if Abs(y-v2)<=dy
{
y:=v2, add:=0
Break
}
if (add)
ypos.Push(y)
n:=(y*150000+x) "." k, s:=A_Index=1 ? n : s "-" n
}
Sort, s, N D-
ok2:=[]
Loop, Parse, s, -
ok2.Push( ok[(StrSplit(A_LoopField,".")[2])] )
return, ok2
}
; 以指定点为中心,按从近到远排序FindText()的结果
; 返回排序后的数组对象
SortOK2(ok, px, py)
{
if !IsObject(ok)
return, ok
SetFormat, IntegerFast, d
For k,v in ok
{
x:=v.1+v.3//2, y:=v.2+v.4//2
n:=((x-px)**2+(y-py)**2) "." k
s:=A_Index=1 ? n : s "-" n
}
Sort, s, N D-
ok2:=[]
Loop, Parse, s, -
ok2.Push( ok[(StrSplit(A_LoopField,".")[2])] )
return, ok2
}
; 提示某个坐标的位置,或远程控制中当前鼠标的位置
MouseTip(x:="", y:="")
{
if (x="")
{
VarSetCapacity(pt,16,0), DllCall("GetCursorPos","ptr",&pt)
x:=NumGet(pt,0,"uint"), y:=NumGet(pt,4,"uint")
}
x:=Round(x-10), y:=Round(y-10), w:=h:=2*10+1
;-------------------------
Gui, _MouseTip_: +AlwaysOnTop -Caption +ToolWindow +Hwndmyid +E0x08000000
Gui, _MouseTip_: Show, Hide w%w% h%h%
;-------------------------
dhw:=A_DetectHiddenWindows
DetectHiddenWindows, On
d:=4, i:=w-d, j:=h-d
s=0-0 %w%-0 %w%-%h% 0-%h% 0-0
s=%s% %d%-%d% %i%-%d% %i%-%j% %d%-%j% %d%-%d%
WinSet, Region, %s%, ahk_id %myid%
DetectHiddenWindows, %dhw%
;-------------------------
Gui, _MouseTip_: Show, NA x%x% y%y%
Loop, 4
{
Gui, _MouseTip_: Color, % A_Index & 1 ? "Red" : "Blue"
Sleep, 500
}
Gui, _MouseTip_: Destroy
}
/***** 机器码的 C语言 源代码 *****
int __attribute__((__stdcall__)) PicFind(
int mode, unsigned int c, unsigned int n
, int offsetX, int offsetY, unsigned char * Bmp
, int Stride, int sx, int sy, int sw, int sh
, unsigned char * gs, char * ss, char * text
, int * s1, int * s0, int * input, int num
, unsigned int * allpos, int allpos_max)
{
int o, i, j, x, y, r, g, b, rr, gg, bb, max, e1, e0, ok;
int o1, x1, y1, w1, h1, sx1, sy1, len1, len0, err1, err0;
int o2, x2, y2, w2, h2, sx2, sy2, len21, len20, err21, err20;
int r_min, r_max, g_min, g_max, b_min, b_max;
//----------------------
ok=0; w1=input[1]; h1=input[2];
len1=input[3]; len0=input[4];
err1=input[5]; err0=input[6];
max=len1>len0 ? len1 : len0;
//----------------------
// 生成查表需要的表格
for (j=0; j<num; j+=7)
{
o=o1=o2=input[j]; w2=input[j+1]; h2=input[j+2];
for (y=0; y<h2; y++)
{
for (x=0; x<w2; x++)
{
i=(mode==3) ? y*Stride+x*4 : y*sw+x;
if (text[o++]=='1')
s1[o1++]=i;
else
s0[o2++]=i;
}
}
}
// 颜色位置模式
// 此模式不支持文字组合查找,仅用于多色验证码的识别
if (mode==3)
{
c=(c/w1)*Stride+(c%w1)*4;
sx1=sx+sw-w1; sy1=sy+sh-h1;
for (y=sy; y<=sy1; y++)
{
for (x=sx; x<=sx1; x++)
{
o=y*Stride+x*4; e1=err1; e0=err0;
j=o+c; rr=Bmp[2+j]; gg=Bmp[1+j]; bb=Bmp[j];
for (i=0; i<max; i++)
{
if (i<len1)
{
j=o+s1[i]; r=Bmp[2+j]-rr; g=Bmp[1+j]-gg; b=Bmp[j]-bb;
if (3*r*r+4*g*g+2*b*b>n && (--e1)<0)
goto NoMatch3;
}
if (i<len0)
{
j=o+s0[i]; r=Bmp[2+j]-rr; g=Bmp[1+j]-gg; b=Bmp[j]-bb;
if (3*r*r+4*g*g+2*b*b<=n && (--e0)<0)
goto NoMatch3;
}
}
allpos[ok++]=y<<16|x;
if (ok>=allpos_max)
goto Return1;
NoMatch3:
continue;
}
}
goto Return1;
}
// 生成二值化图像
o=sy*Stride+sx*4; j=Stride-4*sw; i=0;
if (mode==0) // 颜色相似二值化
{
rr=(c>>16)&0xFF; gg=(c>>8)&0xFF; bb=c&0xFF;
for (y=0; y<sh; y++, o+=j)
for (x=0; x<sw; x++, o+=4, i++)
{
r=Bmp[2+o]-rr; g=Bmp[1+o]-gg; b=Bmp[o]-bb;
ss[i]=(3*r*r+4*g*g+2*b*b<=n) ? 1:0;
}
}
else if (mode==1) // 灰度阈值二值化
{
c=(c+1)*128;
for (y=0; y<sh; y++, o+=j)
for (x=0; x<sw; x++, o+=4, i++)
ss[i]=(Bmp[2+o]*38+Bmp[1+o]*75+Bmp[o]*15<c) ? 1:0;
}
else if (mode==2) // 灰度差值二值化
{
for (y=0; y<sh; y++, o+=j)
{
for (x=0; x<sw; x++, o+=4, i++)
{
gs[i]=(Bmp[2+o]*38+Bmp[1+o]*75+Bmp[o]*15)>>7;
ss[i]=0;
}
}
sx1=sw-2; sy1=sh-2;
for (y=1; y<=sy1; y++)
for (x=1; x<=sx1; x++)
{
i=y*sw+x; j=gs[i]+c;
if ( gs[i-1]>j || gs[i+1]>j
|| gs[i-sw]>j || gs[i+sw]>j
|| gs[i-sw-1]>j || gs[i-sw+1]>j
|| gs[i+sw-1]>j || gs[i+sw+1]>j )
ss[i]=1;
}
}
else // (mode==4) 颜色分量二值化
{
r=(c>>16)&0xFF; g=(c>>8)&0xFF; b=c&0xFF;
rr=(n>>16)&0xFF; gg=(n>>8)&0xFF; bb=n&0xFF;
r_min=r-rr; g_min=g-gg; b_min=b-bb;
r_max=r+rr; g_max=g+gg; b_max=b+bb;
for (y=0; y<sh; y++, o+=j)
for (x=0; x<sw; x++, o+=4, i++)
{
r=Bmp[2+o]; g=Bmp[1+o]; b=Bmp[o];
ss[i]=(r>=r_min && r<=r_max
&& g>=g_min && g<=g_max
&& b>=b_min && b<=b_max) ? 1:0;
}
}
// 开始查找
sx1=sw-w1; sy1=sh-h1;
for (y=0; y<=sy1; y++)
{
for (x=0; x<=sx1; x++)
{
o=y*sw+x; e1=err1; e0=err0;
if (e0==len0)
{
for (i=0; i<len1; i++)
if (ss[o+s1[i]]!=1 && (--e1)<0)
goto NoMatch1;
}
else
{
for (i=0; i<max; i++)
{
if (i<len1 && ss[o+s1[i]]!=1 && (--e1)<0)
goto NoMatch1;
if (i<len0 && ss[o+s0[i]]!=0 && (--e0)<0)
goto NoMatch1;
}
}
//------------------
// 组合查找
if (num>7)
{
x1=x+w1-1; y1=y-offsetY; if (y1<0) y1=0;
for (j=7; j<num; j+=7)
{
o2=input[j]; w2=input[j+1]; h2=input[j+2];
len21=input[j+3]; len20=input[j+4];
err21=input[j+5]; err20=input[j+6];
sx2=sw-w2; i=x1+offsetX; if (i<sx2) sx2=i;
sy2=sh-h2; i=y+offsetY; if (i<sy2) sy2=i;
for (x2=x1; x2<=sx2; x2++)
{
for (y2=y1; y2<=sy2; y2++)
{
o1=y2*sw+x2; e1=err21; e0=err20;
for (i=0; i<len21; i++)
{
if (ss[o1+s1[o2+i]]!=1 && (--e1)<0)
goto NoMatch2;
}
if (e0!=len20)
{
for (i=0; i<len20; i++)
if (ss[o1+s0[o2+i]]!=0 && (--e0)<0)
goto NoMatch2;
}
goto MatchOK;
NoMatch2:
continue;
}
}
goto NoMatch1;
MatchOK:
x1=x2+w2-1;
}
}
//------------------
allpos[ok++]=(sy+y)<<16|(sx+x);
if (ok>=allpos_max)
goto Return1;
// 清空已经找到的图像
for (i=0; i<len1; i++)
ss[o+s1[i]]=0;
NoMatch1:
continue;
}
}
Return1:
return ok;
}
*/
;================= The End =================
SetTitleMatchMode, 2
id:=WinExist(“剑灵 ahk_class LaunchUnrealUWindowsClient”)
BindWindow(id) ; Unbind Window using Bindwindow(0)
SetKeyDelay,10
; #Include
full_command_line := DllCall(“GetCommandLine”, “str”)
if not (A_IsAdmin or RegExMatch(full_command_line, ” /restart(?!S)”))
{
try
{
if A_IsCompiled
Run *RunAs “%A_ScriptFullPath%” /restart
else
Run *RunAs “%A_AhkPath%” /restart “%A_ScriptFullPath%”
}
ExitApp
}
MsgBox,
IniRead,tj,取色值.txt,选项,t键
IniRead,zq,取色值.txt,选项,转圈
if(zq=err){
zq=800
}
StringReplace, tj, tj,{tab},tab,a
gosub,菜单
StringReplace, tj, tj,tab,{tab},a
F12::
v_Enable:=!v_Enable
If (v_Enable=0){
SetTimer, Label, Off
ToolTip, 关
}Else{
SetTimer, Label, 0
ToolTip, 开
}
Return
Label2:
if not(ok:=FindText(20, 49, 1911,510, 0.1, 0.1, Text)){
;~ ControlSend,, {left down},剑灵 ahk_class LaunchUnrealUWindowsClient
send {left down}
Sleep,100
;~ ControlSend,, {left up},剑灵 ahk_class LaunchUnrealUWindowsClient
send {left up}
}
Return
F8::
v_Enable1:=!v_Enable1
If (v_Enable1)=0 {
SetTimer, Label2, Off
}Else{
SetTimer, Label2, %zq%
}
Return
Label:
t1:=A_TickCount
Text:=”|*77$38.zwDrwbw1a7zcy0P0zt7bwbDzNtsPTzmSQ4zzwrblDzzDs6E7zvy0I8zyTzZDDzbzBmNztznAWTyywr8bzi99GPzzCSGQzzbkAUTzvi66Dzznz0zzzwU”
Text5:=”|*144$13.zzU0mGQ76339VIMYAIac1k5sEAzzzzk0807zz” ;交任务卷轴
Text1:=”|*82$29.zzzzzibn0TA3a0zE26NzYwC7l8wk3U0943r/ktziL60TRgDbwX+E1sC4yTU01wzA03tzzzzrw” ;勇猛任务的“选择”
Text2:=”|*73$56.zzzzjvjvzz7z03wswtzwzUDzDb00zDzny05rzzXy01yxtU7tTk0zDSTzyrzvy2560TAy0100BUDrjU0TjrPzttztznxo0QzDyTwzRTqTtzjzA7LxDzC3znzo0Tzzzzyzxzy” ;入手书信
Text3:=”|*102$27.zzxzw0Ac3s7ltw1iTD0EW0805TbCSv1s06DzDyZ0/bxah00spjjrKhnUW00wDzzU” ;书信勇猛
Text4:=”|*96$43.k01xq03s00yG01zbkz9zVzk1zlz7zz3zsznz000wE01btyQ800k00Arzbs007vznwzDnts3y001szbzDnwwDzzbtyQY01nvzAmPgv00DtRrQ001xivDyTwyrRbyTyyPinyDSQ800kTUCA008″ ;接任务勇猛
if (ok:=FindText(20, 20, 2100,426, 0.1, 0.1, Text))
ControlSend,, %tj%,剑灵 ahk_class LaunchUnrealUWindowsClient
else {
if (ok:=FindText(1473,52, 1924,1106, 0.1, 0.1, Text5)){
WinActivate,剑灵 ahk_class LaunchUnrealUWindowsClient
X:=ok.1.x, Y:=ok.1.y
sleep 300
send,{alt down}
sleep 30
click ,%X%,%Y%
sleep 30
send,{alt up}
}
else if (ok:=FindText(334,670, 857,1081, 0.1, 0.1, Text4))
ControlSend,, f,剑灵 ahk_class LaunchUnrealUWindowsClient
else if (ok:=FindText(873,50, 1928,1102, 0.1, 0.1, Text3)){
WinActivate,剑灵 ahk_class LaunchUnrealUWindowsClient
X:=ok.1.x+220, Y:=ok.1.y,
sleep 300
click ,%X%,%Y%
}
else if (ok:=FindText(873,50, 1928,1102, 0.1, 0.1, Text2)){
WinActivate,剑灵 ahk_class LaunchUnrealUWindowsClient
X:=ok.1.x, Y:=ok.1.y
sleep 300
click ,%X%,%Y%
}
else if not (ok:=FindText(1505,49, 1928,1104, 0.3, 0.3, Text1))
ControlSend,, j,剑灵 ahk_class LaunchUnrealUWindowsClient
sleep 300
}
Return
;===== Copy The Following Functions To Your Own Code Just once =====
;——————————–
; FindText – Capture screen image into text and then find it
;——————————–
; X1, Y1 –> the search scope’s upper left corner coordinates
; X2, Y2 –> the search scope’s lower right corner coordinates
; err1, err0 –> Fault tolerance percentage of text and background (0.1=10%)
; Text –> can be a lot of text parsed into images, separated by “|”
; ScreenShot –> if the value is 0, the last screenshot will be used
; FindAll –> if the value is 0, Just find one result and return
; JoinText –> if the value is 1, Join all Text for combination lookup
; offsetX, offsetY –> Set the Max text offset for combination lookup
; ruturn –> the function returns a second-order array
; containing all lookup results, Any result is an associative array
; {1:X, 2:Y, 3:W, 4:H, x:X+W//2, y:Y+H//2, id:Comment},
; if no image is found, the function returns 0.
; All coordinates are relative to Screen, colors are in RGB format,
; and combination lookup must use uniform color mode
;——————————–
FindText( x1, y1, x2, y2, err1, err0, text, ScreenShot:=1
, FindAll:=1, JoinText:=0, offsetX:=20, offsetY:=10 )
{
local ; Unaffected by Super-global variables
bch:=A_BatchLines
SetBatchLines, -1
x:=(x1<x2 ? x1:x2), y:=(y1<y2 ? y1:y2)
, w:=Abs(x2-x1)+1, h:=Abs(y2-y1)+1
, xywh2xywh(x,y,w,h,x,y,w,h,zx,zy,zw,zh)
if (w<1 or h1 or A_Index>1)
err1:=0.1, err0:=0.05
if (JoinText)
{
j:=info[1], mode:=j.8, color:=j.9, n:=j.10
, w1:=-1, h1:=j.3, comment:=””, v:=””, i:=0
Loop, % num
{
j:=info[A_Index], w1+=j.2+1, comment.=j.11
Loop, 7
NumPut((A_Index=1 ? StrLen(v)
: A_Index=6 and err1 and !j.12 ? Round(j.4*err1)
: A_Index=7 and err0 and !j.12 ? Round(j.5*err0)
: j[A_Index]), input, 4*(i++), “int”)
v.=j.1
}
ok:=PicFind( mode,color,n,offsetX,offsetY
, bits,sx,sy,sw,sh,gs,ss,v,s1,s0
, input,num*7,allpos,allpos_max )
Loop, % ok
pos:=NumGet(allpos, 4*(A_Index-1), “uint”)
, rx:=(pos&0xFFFF)+zx, ry:=(pos>>16)+zy
, arr.Push( {1:rx, 2:ry, 3:w1, 4:h1
, x:rx+w1//2, y:ry+h1//2, id:comment} )
}
else
{
For i,j in info
{
mode:=j.8, color:=j.9, n:=j.10, comment:=j.11
, w1:=j.2, h1:=j.3, v:=j.1
Loop, 7
NumPut((A_Index=1 ? 0
: A_Index=6 and err1 and !j.12 ? Round(j.4*err1)
: A_Index=7 and err0 and !j.12 ? Round(j.5*err0)
: j[A_Index]), input, 4*(A_Index-1), “int”)
ok:=PicFind( mode,color,n,offsetX,offsetY
, bits,sx,sy,sw,sh,gs,ss,v,s1,s0
, input,7,allpos,allpos_max )
Loop, % ok
pos:=NumGet(allpos, 4*(A_Index-1), “uint”)
, rx:=(pos&0xFFFF)+zx, ry:=(pos>>16)+zy
, arr.Push( {1:rx, 2:ry, 3:w1, 4:h1
, x:rx+w1//2, y:ry+h1//2, id:comment} )
if (ok and !FindAll)
Break
}
}
if (err1=0 and err0=0 and num=1 and !arr.MaxIndex())
{
k:=0
For i,j in info
k+=(!j.12)
IfEqual, k, 0, Break
}
else Break
}
SetBatchLines, %bch%
return, arr.MaxIndex() ? arr:0
}
; Bind the window so that it can find images when obscured
; by other windows, it’s equivalent to always being
; at the front desk. Unbind Window using Bindwindow(0)
BindWindow(window_id:=0, set_exstyle:=0, get:=0)
{
static id, old, Ptr:=A_PtrSize ? “UPtr” : “UInt”
if (get)
return, id
if (window_id)
{
id:=window_id, old:=0
if (set_exstyle)
{
WinGet, old, ExStyle, ahk_id %id%
WinSet, Transparent, 255, ahk_id %id%
Loop, 30
{
Sleep, 100
WinGet, i, Transparent, ahk_id %id%
}
Until (i=255)
}
}
else
{
if (old)
WinSet, ExStyle, %old%, ahk_id %id%
id:=old:=0
}
}
xywh2xywh(x1,y1,w1,h1, ByRef x,ByRef y,ByRef w,ByRef h
, ByRef zx:=””, ByRef zy:=””, ByRef zw:=””, ByRef zh:=””)
{
SysGet, zx, 76
SysGet, zy, 77
SysGet, zw, 78
SysGet, zh, 79
left:=x1, right:=x1+w1-1, up:=y1, down:=y1+h1-1
left:=leftzx+zw-1 ? zx+zw-1:right
up:=upzy+zh-1 ? zy+zh-1:down
x:=left, y:=up, w:=right-left+1, h:=down-up+1
}
GetBitsFromScreen(x, y, w, h, ScreenShot:=1
, ByRef zx:=””, ByRef zy:=””, ByRef zw:=””, ByRef zh:=””)
{
local ; Unaffected by Super-global variables
static hBM, oldzx, oldzy, oldzw, oldzh, bits:=[]
static Ptr:=A_PtrSize ? “UPtr” : “UInt”
static init:=!GetBitsFromScreen(0,0,0,0,1)
if (!ScreenShot)
{
zx:=oldzx, zy:=oldzy, zw:=oldzw, zh:=oldzh
return, bits
}
bch:=A_BatchLines, cri:=A_IsCritical
Critical
if (zw<1 or zholdzw or zh>oldzh or !hBM)
{
DllCall(“DeleteObject”, Ptr,hBM), hBM:=””, bpp:=32
VarSetCapacity(bi, 40, 0), NumPut(40, bi, 0, “int”)
NumPut(zw, bi, 4, “int”), NumPut(-zh, bi, 8, “int”)
NumPut(1, bi, 12, “short”), NumPut(bpp, bi, 14, “short”)
hBM:=DllCall(“CreateDIBSection”, Ptr,0, Ptr,&bi
, “int”,0, Ptr “*”,ppvBits, Ptr,0, “int”,0, Ptr)
Scan0:=(!hBM ? 0:ppvBits), Stride:=((zw*bpp+31)//32)*4
bits.1:=Scan0, bits.2:=Stride
oldzx:=zx, oldzy:=zy, oldzw:=zw, oldzh:=zh
x:=zx, y:=zy, w:=zw, h:=zh
}
if (hBM) and !(w<1 or h<1)
{
win:=DllCall("GetDesktopWindow", Ptr)
hDC:=DllCall("GetWindowDC", Ptr,win, Ptr)
mDC:=DllCall("CreateCompatibleDC", Ptr,hDC, Ptr)
oBM:=DllCall("SelectObject", Ptr,mDC, Ptr,hBM, Ptr)
DllCall("BitBlt",Ptr,mDC,"int",x-zx,"int",y-zy,"int",w,"int",h
, Ptr,hDC, "int",x, "int",y, "uint",0x00CC0020|0x40000000)
DllCall("ReleaseDC", Ptr,win, Ptr,hDC)
if (id:=BindWindow(0,0,1))
WinGet, id, ID, ahk_id %id%
if (id)
{
WinGetPos, wx, wy, ww, wh, ahk_id %id%
left:=x, right:=x+w-1, up:=y, down:=y+h-1
left:=leftwx+ww-1 ? wx+ww-1:right
up:=upwy+wh-1 ? wy+wh-1:down
x:=left, y:=up, w:=right-left+1, h:=down-up+1
}
if (id) and !(w<1 or h<1)
{
hDC2:=DllCall("GetDCEx", Ptr,id, Ptr,0, "int",3, Ptr)
DllCall("BitBlt",Ptr,mDC,"int",x-zx,"int",y-zy,"int",w,"int",h
, Ptr,hDC2, "int",x-wx, "int",y-wy, "uint",0x00CC0020|0x40000000)
DllCall("ReleaseDC", Ptr,id, Ptr,hDC2)
}
DllCall("SelectObject", Ptr,mDC, Ptr,oBM)
DllCall("DeleteDC", Ptr,mDC)
}
Critical, %cri%
SetBatchLines, %bch%
return, bits
}
PicInfo(text)
{
static info:=[]
IfNotInString, text, $, return
if (info[text])
return, info[text]
v:=text, comment:="", e1:=e0:=0, set_e1_e0:=0
; You Can Add Comment Text within The
if RegExMatch(v,”]*)>”,r)
v:=StrReplace(v,r), comment:=Trim(r1)
; You can Add two fault-tolerant in the [], separated by commas
if RegExMatch(v,”[([^]]*)]”,r)
{
v:=StrReplace(v,r), r1.=”,”
StringSplit, r, r1, `,
e1:=r1, e0:=r2, set_e1_e0:=1
}
StringSplit, r, v, $
color:=r1, v:=r2 “.”
StringSplit, r, v, .
w1:=r1, v:=base64tobit(r2), h1:=StrLen(v)//w1
if (w1<1 or h1>5&1) . (i>>4&1)
. (i>>3&1) . (i>>2&1) . (i>>1&1) . (i&1)
s:=StrReplace(s,A_LoopField,v)
}
ListLines, %lls%
StringCaseSense, Off
s:=SubStr(s,1,InStr(s,”1″,0,0)-1)
s:=RegExReplace(s,”[^01]+”)
return, s
}
bit2base64(s)
{
s:=RegExReplace(s,”[^01]+”)
s.=SubStr(“100000″,1,6-Mod(StrLen(s),6))
s:=RegExReplace(s,”.{6}”,”|$0″)
Chars:=”0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZ”
. “abcdefghijklmnopqrstuvwxyz”
SetFormat, IntegerFast, d
lls:=A_ListLines=0 ? “Off” : “On”
ListLines, Off
Loop, Parse, Chars
{
i:=A_Index-1, v:=”|” . (i>>5&1) . (i>>4&1)
. (i>>3&1) . (i>>2&1) . (i>>1&1) . (i&1)
s:=StrReplace(s,v,A_LoopField)
}
ListLines, %lls%
return, s
}
ASCII(s)
{
if RegExMatch(s,”$(d+).([w+/]+)”,r)
{
s:=RegExReplace(base64tobit(r2),”.{” r1 “}”,”$0`n”)
s:=StrReplace(StrReplace(s,”0″,”_”),”1″,”0″)
}
else s=
return, s
}
; You can put the text library at the beginning of the script,
; and Use PicLib(Text,1) to add the text library to PicLib()’s Lib,
; Use PicLib(“comment1|comment2|…”) to get text images from Lib
PicLib(comments, add_to_Lib:=0, index:=1)
{
static Lib:=[]
SetFormat, IntegerFast, d
if (add_to_Lib)
{
re:=”]*)>[^$]+$d+.[w+/]+”
Loop, Parse, comments, |
if RegExMatch(A_LoopField,re,r)
{
s1:=Trim(r1), s2:=””
Loop, Parse, s1
s2.=”_” . Ord(A_LoopField)
Lib[index,s2]:=r
}
Lib[index,””]:=””
}
else
{
Text:=””
Loop, Parse, comments, |
{
s1:=Trim(A_LoopField), s2:=””
Loop, Parse, s1
s2.=”_” . Ord(A_LoopField)
Text.=”|” . Lib[index,s2]
}
return, Text
}
}
PicN(Number, index:=1)
{
return, PicLib(RegExReplace(Number,”.”,”|$0″), 0, index)
}
; Use PicX(Text) to automatically cut into multiple characters
; Can’t be used in ColorPos mode, because it can cause position errors
PicX(Text)
{
if !RegExMatch(Text,”|([^$]+)$(d+).([w+/]+)”,r)
return, Text
w:=r2, v:=base64tobit(r3), Text:=””
c:=StrLen(StrReplace(v,”0″))<=StrLen(v)//2 ? "1":"0"
wz:=RegExReplace(v,".{" w "}","$0`n")
SetFormat, IntegerFast, d
While InStr(wz,c)
{
While !(wz~="m`n)^" c)
wz:=RegExReplace(wz,"m`n)^.")
i:=0
While (wz~="m`n)^.{" i "}" c)
i++
v:=RegExReplace(wz,"m`n)^(.{" i "}).*","$1")
wz:=RegExReplace(wz,"m`n)^.{" i "}")
if (v!="")
Text.="|" r1 "$" i "." bit2base64(v)
}
return, Text
}
; Screenshot and retained as the last screenshot.
ScreenShot(x1:="", y1:="", x2:="", y2:="")
{
if (x1+y1+x2+y2="")
n:=150000, x:=y:=-n, w:=h:=2*n
else
x:=(x1<x2 ? x1:x2), y:=(y1<y2 ? y1:y2)
, w:=Abs(x2-x1)+1, h:=Abs(y2-y1)+1
xywh2xywh(x,y,w,h,x,y,w,h,zx,zy,zw,zh)
GetBitsFromScreen(x,y,w,h,1,zx,zy,zw,zh)
}
; Get the RGB color of a point from the last screenshot.
; If the point to get the color is beyond the range of
; Screen, it will return White color (0xFFFFFF).
ScreenShot_GetColor(x,y)
{
bits:=GetBitsFromScreen(0,0,0,0,0,zx,zy,zw,zh)
return, (xzx+zw-1 or yzy+zh-1 or !bits.1)
? “0xFFFFFF” : Format(“0x{:06X}”,NumGet(bits.1
+(y-zy)*bits.2+(x-zx)*4,”uint”)&0xFFFFFF)
}
; Identify a line of text or verification code
; based on the result returned by FindText()
; Return Association array {ocr:Text, x:X, y:Y}
OcrOK(ok, offsetX:=20, offsetY:=20)
{
ocr_Text:=ocr_X:=ocr_Y:=min_X:=””
For k,v in ok
x:=v.1
, min_X:=(A_Index=1 or xmax_X ? x : max_X)
While (min_X!=”” and min_X<=max_X)
{
LeftX:=""
For k,v in ok
{
x:=v.1, y:=v.2, w:=v.3, h:=v.4
if (xoffsetY
Continue
; Get the leftmost X coordinates
if (LeftX=”” or xoffsetX ? “*”:””) . LeftOCR
; Update min_X for next search
min_X:=LeftX+LeftW
}
return, {ocr:ocr_Text, x:ocr_X, y:ocr_Y}
}
; Sort the results returned by FindText() from left to right
; and top to bottom, ignore slight height difference
SortOK(ok, dy:=10)
{
if !IsObject(ok)
return, ok
SetFormat, IntegerFast, d
ypos:=[]
For k,v in ok
{
x:=v.x, y:=v.y, add:=1
For k2,v2 in ypos
if Abs(y-v2)len0 ? len1 : len0;
//———————-
// Generate Lookup Table
for (j=0; j<num; j+=7)
{
o=o1=o2=input[j]; w2=input[j+1]; h2=input[j+2];
for (y=0; y<h2; y++)
{
for (x=0; x<w2; x++)
{
i=(mode==3) ? y*Stride+x*4 : y*sw+x;
if (text[o++]=='1')
s1[o1++]=i;
else
s0[o2++]=i;
}
}
}
// Color Position Mode
// This mode is not support combination lookup
// only used to recognize multicolored Verification Code
if (mode==3)
{
c=(c/w1)*Stride+(c%w1)*4;
sx1=sx+sw-w1; sy1=sy+sh-h1;
for (y=sy; y<=sy1; y++)
{
for (x=sx; x<=sx1; x++)
{
o=y*Stride+x*4; e1=err1; e0=err0;
j=o+c; rr=Bmp[2+j]; gg=Bmp[1+j]; bb=Bmp[j];
for (i=0; i<max; i++)
{
if (in && (–e1)<0)
goto NoMatch3;
}
if (i<len0)
{
j=o+s0[i]; r=Bmp[2+j]-rr; g=Bmp[1+j]-gg; b=Bmp[j]-bb;
if (3*r*r+4*g*g+2*b*b<=n && (–e0)<0)
goto NoMatch3;
}
}
allpos[ok++]=y<=allpos_max)
goto Return1;
NoMatch3:
continue;
}
}
goto Return1;
}
// Generate Two Value Image
o=sy*Stride+sx*4; j=Stride-4*sw; i=0;
if (mode==0) // Color Mode
{
rr=(c>>16)&0xFF; gg=(c>>8)&0xFF; bb=c&0xFF;
for (y=0; y<sh; y++, o+=j)
for (x=0; x<sw; x++, o+=4, i++)
{
r=Bmp[2+o]-rr; g=Bmp[1+o]-gg; b=Bmp[o]-bb;
ss[i]=(3*r*r+4*g*g+2*b*b<=n) ? 1:0;
}
}
else if (mode==1) // Gray Threshold Mode
{
c=(c+1)*128;
for (y=0; y<sh; y++, o+=j)
for (x=0; x<sw; x++, o+=4, i++)
ss[i]=(Bmp[2+o]*38+Bmp[1+o]*75+Bmp[o]*15<c) ? 1:0;
}
else if (mode==2) // Gray Difference Mode
{
for (y=0; y<sh; y++, o+=j)
{
for (x=0; x>7;
ss[i]=0;
}
}
sx1=sw-2; sy1=sh-2;
for (y=1; y<=sy1; y++)
for (x=1; xj || gs[i+1]>j
|| gs[i-sw]>j || gs[i+sw]>j
|| gs[i-sw-1]>j || gs[i-sw+1]>j
|| gs[i+sw-1]>j || gs[i+sw+1]>j )
ss[i]=1;
}
}
else // (mode==4) Color Difference Mode
{
r=(c>>16)&0xFF; g=(c>>8)&0xFF; b=c&0xFF;
rr=(n>>16)&0xFF; gg=(n>>8)&0xFF; bb=n&0xFF;
r_min=r-rr; g_min=g-gg; b_min=b-bb;
r_max=r+rr; g_max=g+gg; b_max=b+bb;
for (y=0; y<sh; y++, o+=j)
for (x=0; x=r_min && r=g_min && g=b_min && b<=b_max) ? 1:0;
}
}
// Start Lookup
sx1=sw-w1; sy1=sh-h1;
for (y=0; y<=sy1; y++)
{
for (x=0; x<=sx1; x++)
{
o=y*sw+x; e1=err1; e0=err0;
if (e0==len0)
{
for (i=0; i<len1; i++)
if (ss[o+s1[i]]!=1 && (–e1)<0)
goto NoMatch1;
}
else
{
for (i=0; i<max; i++)
{
if (i<len1 && ss[o+s1[i]]!=1 && (–e1)<0)
goto NoMatch1;
if (i<len0 && ss[o+s0[i]]!=0 && (–e0)7)
{
x1=x+w1-1; y1=y-offsetY; if (y1<0) y1=0;
for (j=7; j<num; j+=7)
{
o2=input[j]; w2=input[j+1]; h2=input[j+2];
len21=input[j+3]; len20=input[j+4];
err21=input[j+5]; err20=input[j+6];
sx2=sw-w2; i=x1+offsetX; if (i<sx2) sx2=i;
sy2=sh-h2; i=y+offsetY; if (i<sy2) sy2=i;
for (x2=x1; x2<=sx2; x2++)
{
for (y2=y1; y2<=sy2; y2++)
{
o1=y2*sw+x2; e1=err21; e0=err20;
for (i=0; i<len21; i++)
{
if (ss[o1+s1[o2+i]]!=1 && (–e1)<0)
goto NoMatch2;
}
if (e0!=len20)
{
for (i=0; i<len20; i++)
if (ss[o1+s0[o2+i]]!=0 && (–e0)<0)
goto NoMatch2;
}
goto MatchOK;
NoMatch2:
continue;
}
}
goto NoMatch1;
MatchOK:
x1=x2+w2-1;
}
}
//——————
allpos[ok++]=(sy+y)<=allpos_max)
goto Return1;
// Clear the image that has been found
for (i=0; i<len1; i++)
ss[o+s1[i]]=0;
NoMatch1:
continue;
}
}
Return1:
return ok;
}
*/
;================= The End =================
F11::
MsgBox,按F12切换开关,F8切换旋转`n `n仅为1920*1080分辨率制作。且界面需按以下说明调节。`n按O打开游戏设置`n游戏/界面/无视因分辨率对界面大小的调节打√,界面大小调整为95。`n图像/画面亮度调节为50。`n视频教程B站搜索“飘渺闪电”
return
菜单:
Menu,Tray,NoStandard
Menu,Tray,DeleteAll
Menu,Tray,Add,&暂停/启用,zt
Menu,Tray,Add,&设置,用户界面
Menu,Tray,Add,&退出,tc
用户界面:
Gui, Add, Text, x10 y32 w80 h20 +Center, 打怪快捷键
Gui, Add, Text, x30 y10 w100 h20 +Center, F11查看简要说明
Gui, Add, Text, x10 y55 w130 h20 +Center, 转圈速度,填越大越慢
Gui, Add, Text, x20 y77 w130 h20 , 如200~2000
Gui, Add, Edit, x85 y76 w50 h20 Lowercase vzq -Multi, %zq%
Gui, Add, Edit, x85 y30 w50 h20 Lowercase vtj -Multi, %tj%
Gui, Add, Button, x50 y105 w70 h30 g确定, 确定
; Generated using SmartGuiXP Creator mod 4.3.29.0
Gui, Show, Center w150 h140, 刷勇猛
Return
GuiClose:
Gui Destroy
return
确定:
Gui,Submit ,NoHide
StringReplace, tj, tj,tab,{tab},a
IniWrite,%tj%,取色值.txt,选项,t键
IniWrite,%zq%,取色值.txt,选项,转圈
MsgBox 设置已保存
return
zt:
Suspend,Toggle
Pause,Toggle
tzxh=1
return
tc:
ExitApp
return
大佬能看看这个虚幻三的怎么改虚幻四还能接着用么
飞跃大佬的找字方法,你把虚幻三里面的找字内容更换成虚幻4的就行了,具体的通过findtext.ahk
之前看还没注意,这是个后台的虚幻3蜘蛛
分享的下载文件已经失效了,如有需要的,请自行抄录
下载文件已经重新上传了
大佬又更新?
?看得眼睛疼。
能再上传一下吗
这个只是参考内容,里面的截取部分需要自己进行修改