广告合作
  • 今日头条

    今日头条

  • 百度一下

    百度一下,你就知道

  • 新浪网

    新浪网 - 提供新闻线索,重大新闻爆料

  • 搜狐

    搜狐

  • 豆瓣

    豆瓣

  • 百度贴吧

    百度贴吧——全球领先的中文社区

  • 首页 尚未审核订阅工具 订阅

    按键精灵实现多线程多开脚本教程

    来源:网络收集  点击:  时间:2024-03-03
    【导读】:
    “多线程到底怎么实现?好复杂!”小编时常在论坛里,看到有童鞋发出这样的疑问。小编觉得多线程就好似冰山美人,外冷内热。乍一看,好像很不好相处,近一步,则会发现其实她很温柔。 到底有多温柔呢?一起来看看~工具/原料more按键精灵2014方法/步骤1/15分步阅读

    QUI界面

    写代码之前,我们先画脚本的Qui界面。如下图:

    2/15

    思路

    我们拿记事本作为多开的对象。脚本由以下三个按钮点击事件组成:1、点击QUI界面中的一键启动按钮,启动记事本,启动的记事本个数由InputBox1里填入的数值决定。启动线程,将线程id、窗口句柄记录到ini文件中。在线程调用的子程序里,对记事本输入内容。2、点击“关闭所有窗口”按钮,则读取ini中保存的线程id、窗口句柄,关闭线程之后关闭窗口。3、点击“暂停”按钮,则读取ini文件中和InputBox2文本框中对应数值的窗线程id,暂停该线程。再次点击“暂停”按钮,则读取ini文件中和InputBox2文本框中对应数值的窗线程id,恢复该线程。

    3/15

    “一键启动”按钮点击事件

    步骤:

    1、启动记事本窗口。2、修改记事本的标题名称。3、每个记事本窗口对应启动一个线程。4、将窗口句柄、线程id记录到ini文件中。

    4/15

    1、启动记事本窗口。获取InputBox1中的数值。利用for循环打开记事本窗口。

    Fori=1ToForm1.InputBox1.Text

    //打开记事本

    RunAppNotepad.exe

    Next

    打开记事本之后,我们需要判断下记事本是不是已经打开,如果打开了则获取窗口句柄,如果没有打开,则继续循环判断记事本是不是已经打开。避免当游戏窗口还没有打开获取不到窗口句柄的情况。

    do

    hwnd=Plugin.Window.Find(0,无标题-记事本)//获取记事本句柄

    Loopwhile(Hwnd=0)

    5/15

    2、修改记事本窗口的标题。修改了窗口标题,便于我们管理多窗口。且:第1点中说到的判断记事本窗口是不是打开,当游戏窗口标题都是一样的情况下,这个方法就会失效。第一个窗口打开了,第二个窗口不管有没有打开,那么获取到的还是第一个窗口的句柄。

    Do

    Ifstext=第i窗口Then

    ExitDo

    EndIf

    callPlugin.Window.SetText(hwnd,第i窗口)

    stext=Plugin.Window.GetText(hwnd)

    Loop//循环的第一次修改窗口标题,第二次开始判断标题有没有修改成功,没有的话则继续修改,成功的话则退出do循环。

    6/15

    3、启动多线程。(线程相关知识)

    线程ID=BeginThread(打字)

    在for循环里加入这一句启动线程的代码,每循环一次开启一个新的线程。所以,在启动完线程之后,要趁热把线程id记录起来。

    7/15

    4、将窗口句柄、线程id存放到ini文件中。(ini文件读取写入相关知识)

    CallPlugin.File.WriteINI(窗口句柄,第i窗口,hwnd,C:\记录.ini)

    CallPlugin.File.WriteINI(线程ID,第i窗口,线程ID,C:\记录.ini)

    8/15

    线程调用子程序

    被线程调用的子程序和平常的子程序有什么不同吗?有两点不一样:1、被线程调用的子程序,不支持参数传递。2、被线程调用的子程序,不支持dim定义的局部变量的传递。建立一个要被线程调用的子程序,命名为“打字”

    Sub打字()

    窗口句柄=hwnd//hwnd是环境变量,在一键启动事件中,将窗口句柄赋值给了它。

    Do

    hwnds=Plugin.Window.FindEx(窗口句柄,0,Edit,0)

    LoopWhile(hwnds=0)

    Fori=1To200

    CallPlugin.Bkgnd.SendString(hwnds,i)

    CallPlugin.Bkgnd.KeyPress(Hwnds,13)

    Next

    EndSub

    9/15

    注意:为什么在子程序的开头,要拿一个新的变量窗口句柄去获取hwnd的值呢? 本例中,我们循环多开窗口的时候,每循环一次,hwnd的值就变化一次。 循环第一次,hwnd的值为:328202,启动线程之后,调用sub打字()子程序,获取记事本的子窗口句柄。 循环第二次,hwnd的值为:197298,启动线程之后,调用sub打字()子程序,获取记事本的子窗口句柄。 如果顺利循环下去没有问题,但是,如果第一个窗口开启的时候卡住了呢?第二个窗口开启的速度比第一个快,hwnd中存放的数据变成了第二个窗口的句柄,这个时候第一个窗口缓过来了,它调用到的hwnd里已经不是自己的窗口句柄,而是第二个窗口的。

    所以,当第一个窗口启动线程,调用sub打字()子程序,在子程序的开头位置,第一个窗口的窗口句柄hwnd用新的变量存起来。新的变量没有定义,默认是dim局部变量,局部变量是不能在线程间传递的,所以它只在当前线程有效,不影响其它线程。

    10/15

    “暂停”按钮点击事件

    步骤:

    1、当按钮的标题名称为“暂停”的时候:暂停InputBox2文本框中数值对应的线程。并且将按钮的标题修改为继续。2、当按钮的标题名称为“继续”的时候:恢复InputBox2文本框中数值对应的线程。并且将按钮的标题修改为暂停。

    11/15

    IfForm1.暂停.Caption=暂停Then

    暂停线程id=Plugin.File.readINI(线程ID,第cint(Form1.InputBox2.Text)窗口,C:\记录.ini)

    PauseThread暂停线程id

    Form1.暂停.Caption=继续

    else

    继续线程id=Plugin.File.readINI(线程ID,第cint(Form1.InputBox2.Text)窗口,C:\记录.ini)

    ContinueThread继续线程id

    Form1.暂停.Caption=暂停

    EndIf

    12/15

    “关闭所有窗口”按钮点击事件

    步骤:

    1、获取ini文件中记录的线程id,关闭所有线程。2、获取ini文件中记录的窗口句柄,关闭所有记事本窗口。

    Fori=1Tocint(Form1.InputBox1.Text)

    关闭线程id=Plugin.File.readINI(线程ID,第i窗口,C:\记录.ini)

    StopThread关闭线程id//关闭线程

    CallPlugin.Window.Close(Plugin.File.readINI(窗口句柄,第i窗口,C:\记录.ini))//关闭窗口

    Next

    13/15

    整体代码:

    Dimenvhwnd

    EventForm1.一键启动.Click

    Fori=1ToForm1.InputBox1.Text

    //打开记事本

    RunAppNotepad.exe

    //判断记事本是否打开

    do

    hwnd=Plugin.Window.Find(0,无标题-记事本)//获取记事本句柄

    Loopwhile(Hwnd=0)

    CallPlugin.Window.Move(hwnd,i*50+100,200)//设置记事本出现在屏幕上的位置,横坐标递增,然后窗口可以依次排列开,方便查看运行效果

    //////////////修改窗口标题////////////////

    Do

    Ifstext=第i窗口Then

    ExitDo

    EndIf

    callPlugin.Window.SetText(hwnd,第i窗口)

    stext=Plugin.Window.GetText(hwnd)

    Loop

    ////启动线程每使用BeginThread启动一次打字子程序,都是生成一条新的线程

    线程ID=BeginThread(打字)

    //将窗口句柄、线程id记录到ini文件中,便于之后调用

    CallPlugin.File.WriteINI(窗口句柄,第i窗口,hwnd,C:\记录.ini)

    CallPlugin.File.WriteINI(线程ID,第i窗口,线程ID,C:\记录.ini)

    Next

    Form1.一键启动.Enabled=False

    EndEvent

    14/15

    //////////////////关闭线程(StopThread)////////////////////////////

    EventForm1.关闭所有窗口.Click

    Form1.一键启动.Enabled=true

    Fori=1Tocint(Form1.InputBox1.Text)

    关闭线程id=Plugin.File.readINI(线程ID,第i窗口,C:\记录.ini)

    StopThread关闭线程id//关闭线程

    CallPlugin.Window.Close(Plugin.File.readINI(窗口句柄,第i窗口,C:\记录.ini))//关闭窗口

    Next

    EndEvent

    ////////////////线程暂停(PauseThread)、线程恢复(ContinueThread)///

    EventForm1.暂停.Click

    IfForm1.暂停.Caption=暂停Then

    暂停线程id=Plugin.File.readINI(线程ID,第cint(Form1.InputBox2.Text)窗口,C:\记录.ini)

    PauseThread暂停线程id

    Form1.暂停.Caption=继续

    else

    继续线程id=Plugin.File.readINI(线程ID,第cint(Form1.InputBox2.Text)窗口,C:\记录.ini)

    ContinueThread继续线程id

    Form1.暂停.Caption=暂停

    EndIf

    EndEvent

    15/15

    ////////////////打字线程/////////////////////////

    Sub打字()

    窗口句柄=hwnd

    Do

    hwnds=Plugin.Window.FindEx(窗口句柄,0,Edit,0)

    LoopWhile(hwnds=0)

    Fori=1To200

    CallPlugin.Bkgnd.SendString(hwnds,i)

    CallPlugin.Bkgnd.KeyPress(Hwnds,13)

    Next

    EndSub

    onenote
    本文关键词:

    版权声明:

    1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。

    2、本站仅提供信息发布平台,不承担相关法律责任。

    3、若侵犯您的版权或隐私,请联系本站管理员删除。

    4、文章链接:http://www.1haoku.cn/art_233852.html

    相关资讯

    ©2019-2020 http://www.1haoku.cn/ 国ICP备20009186号05-04 23:17:42  耗时:0.028
    0.028s