• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

发新话题 回复该主题

[技术交流] 【院刊】-【201412期】多线程脚本可随意启动/停止指定窗口 [复制链接]

1#

多线程脚本可随意启动/停止指定窗口

您所在的用户组无法下载或查看附件




本文按键学院提供技术支持





上一期内容中,我们说到了,多线程多开脚本的实现方法。
在例子中,我们点击QUI上的一键启动按钮,开启多个窗口,每个窗口对应一个线程。
那有同学问了,不想一键启动怎么办? 想要点击一个窗口按下启动热键就启动一个窗口,要如何实现呢?
我们一起来看看要怎么实现~


上期院刊链接:【院刊】-【201412期】多线程多开脚本如何实现?







我们用记事本来做例子。
实现功能:
1、点击记事本窗口按下f7之后,启动窗口大小渐变线程。每格半秒递增窗口的大小。
2、点击记事本窗口按下f8之后, 关闭窗口所对应的线程。





按F7启动线程



1使用 waitkey (等待按任意键 命令),判断是否按下F7。


F7的按键码=118
代码如下:
  1. Key = WaitKey()
  2. If key = 118 Then
  3. //执行后续代码
  4. End If
复制代码
2使用MousePoint (得到鼠标指向的窗口句柄 命令),获取窗口句柄


获取窗口句柄之后,我们还需要做一个判断,判断当前获取的窗口是不是要绑定的窗口。
如果要绑定的游戏的窗口标题是变化的,我们就判断它的类名。类名不一样的话就重新等待按下F7键,重新获取鼠标指向的窗口句柄。

记事本的类名=“Notepad
代码如下:
  1. Do
  2. Key = WaitKey()
  3. ///////////按下了F7启动线程按钮///////////////
  4. If key = 118 Then
  5. //////获取窗口类名,如果类名不是记事本的类名,则退出循环,重新等待按键////////////
  6. hwnd = Plugin.Window.MousePoint()
  7. sClass = Plugin.Window.GetClass(Hwnd)
  8. If sclass <> "Notepad" Then
  9. Exit Do
  10. End If
  11. End if
  12. Loop
复制代码
3启动线程,将窗口句柄和线程id记录到ini文件中。


启动线程之后,为了提示线程是否启动,修改记事本的窗口标题为"线程启动成功"
另外:气泡提示、屏幕输出等方式都能起到提示的作用。
修改了标题之后,将窗口句柄和线程id记录到ini文件中。


为什么要用ini文件记录呢?环境变量不是更方便吗?
一般情况下,环境变量确实方便多了,但是当多个脚本整合到同一个小精灵的时候,环境变量相同就会产生干扰。而且,脚本退出之后环境变量会清空,如果我们二次开启脚本还需要使用到上一次的窗口句柄,环境变量是不能实现的。


  1. Call Plugin.File.WriteINI("窗口句柄", hwnd, hwnd, "C:\记录.ini")//记录窗口句柄
  2. Call Plugin.File.WriteINI("线程ID", hwnd, 线程ID, "C:\记录.ini")//记录线程id
复制代码

这里记录线程id的时候,把“线程id”小节名下的键值名称设置为窗口句柄,以便于后面结束线程时,根据当前鼠标指向窗口的句柄,找到ini记录里对应的线程id。

将线程id记录到ini文件之前,我们需要先判断下当前所获取到的窗口句柄,是否之前已经启动过线程,用当前的窗口句柄值在ini文件中找对应的线程id, 如果返回值不为空则说明该窗口之前启动过线程,关闭掉线程。(如果不关闭之前开启的线程,会造成一个窗口重复启动多个线程的情况,浪费cpu资源。)

代码如下:
  1. 线程ID = BeginThread(大小)//启动线程
  2. call Plugin.Window.SetText(hwnd,"线程启动成功!") //修改标题提示绑定成功
  3. Call Plugin.File.WriteINI("窗口句柄", hwnd, hwnd, "C:\记录.ini") //记录窗口句柄
  4. xc = Plugin.File.readINI("线程ID", hwnd, "C:\记录.ini")//获取线程id,看看是不是空的,如果不是空的,说明此窗口绑定过线程,关闭线程
  5. If xc <> "" Then
  6. StopThread xc
  7. End If
  8. Call Plugin.File.WriteINI("线程ID", hwnd, 线程ID, "C:\记录.ini")//记录线程id
复制代码



按下F8结束线程

判断按下的键是否是F8,如果是,则获取鼠标指向窗口的窗口句柄。
判断ini文件中线程id的记录,是否有该窗口句柄对应的线程id,有的话,则停止此线程,没有则提示该窗口没有启动过线程。


代码如下:
  1. Do
  2. If key = 119 Then
  3. /////////////获取窗口句柄,看下ini文件中,是否有该窗口句柄的线程id的记录,有的话则停止,没有的话则提示该窗口没有启动过线程////////////
  4. hwnd = Plugin.Window.MousePoint()
  5. 关闭线程id = Plugin.File.readINI("线程ID", hwnd, "C:\记录.ini")
  6. If 关闭线程id = "" Then
  7. MessageBox "当前窗口没启动过线程。"
  8. Exit Do
  9. Else
  10. StopThread 关闭线程id //关闭线程
  11. call Plugin.Window.SetText(hwnd,"停止!")
  12. End If
  13. End If
  14. Loop
复制代码

被线程启动的子程序
子程序命名为:大小。
功能:用于改变记事本的窗口大小。
从宽100,高100,每隔半秒钟递增一次。直到窗口大小为宽1000,高1000

代码如下:
  1. ////////////////窗口大小渐变////////////////////////
  2. Sub 大小()
  3. 窗口句柄 = hwnd
  4. For i = 0 To 90
  5. Call Plugin.Window.Size(窗口句柄, 100+i*10, 100+i*10)
  6. Delay 500
  7. Next
  8. End Sub
复制代码
整体代码
  1. Dimenv hwnd
  2. hwnd = 0
  3. For 3
  4. RunApp "Notepad"
  5. Next
  6. BeginThread 启动
  7. Sub 启动()
  8. Do
  9. Do
  10. Key = WaitKey()
  11. ///////////按下了F7启动线程按钮///////////////
  12. If key = 118 Then
  13. //////获取窗口类名,如果类名不是记事本的类名,则退出循环,重新等待按键////////////
  14. hwnd = Plugin.Window.MousePoint()
  15. sClass = Plugin.Window.GetClass(Hwnd)
  16. If sclass <> "Notepad" Then
  17. Exit Do
  18. End If
  19. 线程ID = BeginThread(大小)//启动线程
  20. call Plugin.Window.SetText(hwnd,"线程启动成功!") //修改标题提示绑定成功
  21. Call Plugin.File.WriteINI("窗口句柄", hwnd, hwnd, "C:\记录.ini") //记录窗口句柄
  22. xc = Plugin.File.readINI("线程ID", hwnd, "C:\记录.ini")//获取线程id,看看是不是空的,如果不是空的,说明此窗口绑定过线程,关闭线程
  23. If xc <> "" Then
  24. StopThread xc
  25. End If
  26. Call Plugin.File.WriteINI("线程ID", hwnd, 线程ID, "C:\记录.ini")//记录线程id
  27. End If
  28. //////////////按下f8停止线程按钮///////////////////
  29. If key = 119 Then
  30. /////////////获取窗口句柄,看下ini文件中,是否有该窗口句柄的线程id的记录,有的话则停止,没有的话则提示该窗口没有启动过线程////////////
  31. hwnd = Plugin.Window.MousePoint()
  32. 关闭线程id = Plugin.File.readINI("线程ID", hwnd, "C:\记录.ini")
  33. If 关闭线程id = "" Then
  34. MessageBox "当前窗口没启动过线程。"
  35. Exit Do
  36. Else
  37. StopThread 关闭线程id //关闭线程
  38. call Plugin.Window.SetText(hwnd,"停止!")
  39. End If
  40. End If
  41. Loop
  42. Loop
  43. End Sub
  44. ////////////////窗口大小渐变////////////////////////
  45. Sub 大小()
  46. 窗口句柄 = hwnd
  47. For i = 0 To 90
  48. Call Plugin.Window.Size(窗口句柄, 100+i*10, 100+i*10)
  49. Delay 500
  50. Next
  51. End Sub
复制代码



本文按键学院提供技术支持




━═━═━━═━═━━═━═━◥◤━═━═━━═━═━━═━═━

有钱,就是任性!按键学院的导师就是土豪!

按键学院实战班


本主题由 超级版主 瑞祥幽冥狼 于 2023/10/5 18:32:21 执行 审核帖子 操作
按键学院免费交流群:376122403

按键学院招生计划
按键学院系统教程
2#

学习中

3#

不错不错,

4#

我来了

5#

玩驱动器二无的无

6#

111111111111111

7#


8#

我们需要先判断下

9#


10#

111111111111111111111111

11#

猎豹浏览器

12#

DDDDDDDDDDDDDDDDDD

13#

感谢分享楼

14#


15#

学海无涯

16#

1111111111111111111

17#

爱过一生无缘的人

18#


19#

11111111

20#

散打王散打王撒分为氛围分为氛围分为

发新话题 回复该主题