分明看了那么多教程,看别人的源码也能看懂,为什么自己要写的时候,却完全写不出来呢?思路!思路!思路很重要!小编今天要说的游戏脚本思路,是DNF登录脚本的一个思路流程。希望对大家有所帮助~
工具/原料
按键精灵2014
方法/步骤
1、流程图
2、启动游戏/查找窗口句柄找到游戏安装目录下的TCLS文件夹下的Client.exe登录程序获取路径水貔藻疽,使用runapp命令启动潮贾篡绐Client.exe启动Client.exe之后,会弹出游戏登录窗口。启动是需要时间的,电脑配置不一样网速不一样,启动的速度都不一致。那我们要如何得知,登录窗口什么时候出现呢?当然是找窗口句柄了对不对,当登录窗口出现,它的句柄就生成。没有出现,就不会有登录窗口的句柄存在。所以,我们只要在启动Client.exe之后,循环查找登录窗口的句柄,如果找到则退出循环,进行下一步操作,如果没有找到,则继续查找。找登录窗口句柄的时候要注意下,不能使用它的类名查找,因为它的类名每次启动都是会变化的,咱们查找标题即可。
3、好了,窗口句柄获取到之后,咱们就要开始先考虑它的绑定模式
4、测试图色/鼠标/文本输入的绑定模式今天咱们的例子,会使用到大漠插件,之前的院刊中,我们有抵足谛垴分享过使用大漠绑定测试工具来测试窗口的绑定模式:传送门酷搭宀玳当然,大漠绑定测试工具测试完,成功的模式,也不能打包票能用,所以我们还需要在脚本里测试经过一番测试,吓尿了~dnf的登录窗口是不支持后台图色绑定的。鼠标模式:windows/dx(其他后台绑定模式未测试)区服选择,登录按钮等都支持windows/dx后台绑定模式。唯有,帐号密码输入框有它们自己的窗口句柄,需要找到它们的句柄才能对它们进行后台操作
5、以桌面作为父窗口用findex命令查找,可以找到这两个类名为Edit的窗口。蒎被眯馄但是,密码输入框,依然还是需要使用键码输入方式方可输入。所以,本例子中不使用后台点击输入文本的方式芟坳葩津,到了要点击帐号密码输入框时,改用前台鼠标点击文本输入:帐号输入框使用了saystring前台文本输入命令密码输入框saystring无效,使用了命令库里的,keylist键码输入命令小编也看了下tx的疾风之刃它的登录窗口也是不支持后台图色。
6、判断是否到了选区界面
7、前面,咱们用找句柄的方式判断了登录窗口是否出现,登录窗口第一个界面不就是选区界面么?那为什么还要再找呢?不是脱裤子放屁多此一举么?实际上,登录窗口句柄形成了之后,还要过一小会儿,它的窗口界面才会显示出来。所以,当它的窗口句柄出现了之后,咱们绑定它,绑定完了之后,我们循环判断红框框中的图片是否出现,出现了则说明选区界面已经加载好了。
8、判断其他图不行吗?为什么非要红框框里的呢?大家一起看下这张图片就明白了:
9、启动之后会出现连接服务器的提示,当它在连接过程中,只有最近登录和推荐大区那一块是没有显示出来的。如果显示出来了,则说明服务器已经连接好了。所以,我们可以通过判断那一块的特征图片来判断连接到服务器没有。然而,最近登录那一块,最近登录过的区服它是会发光的(ps:小编不知道最近登录区,是不是固定都是最后一个球才会发光,所以不稳定的因素,咱们不拿来判断,推荐大区的那两个球不变的地方,都可以用来判断。)
10、选择区服前面,我们已经判断到了选区界面,判断到了选区界面之后,立即点击重新选择大区按钮。
11、然后循环找字,先找大区的区服文字,例如:福建区
12、字体很特别,在咱们的系统字体里找不到匹配的字体,不知道是个什么体这种情况只能辛苦咱们一个个词组的去做字库了(ps:考虑到工作量巨大,所以本例子中,小编只做了一个福建区的字库例子)找到“福建区”单击它,然后循环查找“福建1区”
13、找到“福建1区”之后,需要双击它才能进入帐号密码输入界面判断是否到了帐号密码界面
14、选区界面到帐号密码界面,还需要加载,加载的快慢咱们估摸不来。所以,依旧用找图的方式判断,到了帐号密码界面没有。帐号密码界面的特征图片有许多,“登录游戏”按钮,“选择服务器”按钮等。例子中,找的是“登录游戏”按钮图片
15、获取帐号密码输入框位置,输入帐号密码
16、小编使用大漠综合工具,绑定窗口之后,用取色点获取帐号密码输入框的坐标位置,这样可以省去了一番计算跷孳岔养。获取泺粜嗨埘之后,由于前面的点击动作都是使用后台点击,帐号密码框需要用前台点击,就需要转换坐标这里,使用大漠的GetWindowRect获取窗口在屏幕上的位置命令dm_ret=dm.GetWindowRect(hwnd,x1,y1,x2,y2)返回值:x1,y1是窗口左上角的坐标,加上先前用大漠综合工具绑定获取到的坐标,即转换成屏幕坐标。返回值:x2,y2是窗口右下角坐标接下来就是读取帐号密码,然后进行输入帐号密码,咱们可以记录在记事本里,然后读取,帐号密码输入之后点击登录按钮注意:帐号输入的时候要删除之前的帐号,双击可以选择帐号,但是由于鼠标点击游戏延迟等因素,并不是每次双击都可以稳妥的选中帐号,所以为了稳定起见,我们可以点击帐号框中间的位置,按下backspace20次,删除左边的数字,再按下delete20次删除右边的数字
17、检测是否登录成功要如何判断登录成功与否?在输入了帐号密码的前提下,有三种情况导致登录不了延时,网络情况不好密码错误帐号错误情况1:咱们如法炮制,启动client.exe之后判断登录窗口出现的方法。判断选频道窗口是否出现。可设置长时间没出现,做出相应措施。情况2:密码错误出现的提示:
18、情况3:帐号错误出现的提示:
19、这些提示里,确定按钮都是一样的,还有上方的提示信息四个字也是不变的。为了方便,小编判断确定按钮如果点击了登录之后,等待频道窗口出现的过程中,找到了确定按钮,则说明登录失败点击确定按钮,重新登录,或者做其他的相应措施。
20、整体代码/漆虱忧甘//释放附件//////PutAttachment"D:\test","*.*"Callregister()//调用注册大漠子程序////加载栓疠瑕愤字库//////dm_ret=dm.SetDict(0,"test.txt")////启动游戏////RunApp"F:\地下城与勇士\TCLS\Client.exe"////设置帐号密码/////帐号="1234567"密码="1234567"//查找登录窗口句柄////Dohwnd=Plugin.Window.find(0,"地下城与勇士登录程序")Delay200LoopWhilehwnd=0///绑定窗口激活窗口/////dm_ret=dm.BindWindow(hwnd,"normal","windows","windows",0)dm_ret=dm.SetWindowState(hwnd,1)///获取窗口客户区大小,方便之后缩小范围找图以及后台坐标转成前台坐标dm_ret=dm.GetClientRect(hwnd,x1,y1,x2,y2)//判断是否在选区界面////////Dodm_ret=dm.FindPic(x1,y1,x2,y2,"最近登录.bmp","000000",0.9,0,intX,intY)IfintX>=0andintY>=0ThenDelay1000dm.moveto300,631//点击重新选择大区按钮dm.leftclickEndIfDelay200LoopWhiledm_ret=-1////大漠找图命令,没有找到图返回值是-1////查找大区"福建区"按钮/////Dodm_ret=dm.FindStr(x1,y1,x2,y2,"福建区","dfdfdf-202020",1.0,intX,intY)IfintX>=0andintY>=0Thendm.movetointx,intydm.leftclick//双击"福建区"EndIfDelay200LoopWhiledm_ret=-1////大漠找字命令,没有找到图返回值是-1////查找"福建1区"按钮/////Dodm_ret=dm.FindStr(x1,y1,x2,y2,"福建1区","dfdfdf-202020",1.0,intX,intY)IfintX>=0andintY>=0Thendm.movetointx,intydm.leftdoubleclick//双击"福建1区"EndIfDelay200LoopWhiledm_ret=-1//判断是否在帐号输入界面////////Dodm_ret=dm.FindPic(x1,y1,x2,y2,"登录游戏.bmp","000000",0.9,0,intX,intY)IfintX>=0andintY>=0ThenExitDoEndIfDelay200LoopWhiledm_ret=-1Rema//点击帐号输入框//////Delay1000MoveTox1+493,y1+522LeftClick1///删除之前的帐号/////For20KeyPress8,1NextFor20KeyPress46,1Next////////////////////SayString帐号//点击密码输入框//////movetox1+476,y1+547LeftClick1Delay1000CallLib.键盘.KeyList(密码,2,20)//点击登录按钮////////dm.moveto740,532dm.LeftClickDo///查找密码错误界面////dm_ret=dm.FindPic(x1,y1,x2,y2,"确定.bmp","000000",0.9,0,intX,intY)IfintX>=0andintY>=0ThenDelay1000dm.movetointX,intYdm.leftclickGotoa//出现错误提示,点击确定按钮之后,重新开始输入帐号密码ExitDoEndIf///查找频道选择界面////hwndpd=Plugin.Window.find(0,"地下城与勇士")Ifhwndpd<>0Thendm_ret=dm.UnBindWindow()//解绑登录窗口MessageBox"登录成功"EndIfDelay200LoopWhilehwndpd=0/////注册大漠/////////////Subregister()Setws=createobject("Wscript.Shell")ws.run"regsvr32atl.dll/s"Setws=nothingcallPlugin.RegDll.Reg("D:\test\dm.dll")Setdm=createobject("dm.dmsoft")ver=dm.ver()Iflen(ver)=0ThenMessageBox"插件注册失败,检查系统是否禁用了vbs脚本权限"EndScriptEndIfdm.SetPath"D:\test"EndSubSubOnScriptExit()dm_ret=dm.UnBindWindow()//解绑窗口EndSub