按键精灵多线程的两种控制方法

操作方法

  • 01

    脚本特色:*支持单控和全部一次性控制的操作,不会冲突,不会重复启动。*”热键“版特色,方便用户指定窗口直接启动。*”列表“版特色,实时更新、添加、删除句柄,用户可选中句柄点击操作,双击句柄会自动显示句柄并绘图提醒。在本人测试的期间发现如下改动:1:“热键”控件,支持“热键”事件触发“热键”的注册。即修改了“热键”的按键码后脚本下次启动的时候即可生效,无需其他”事件“来帮助注册。以前需要“按钮”的点击、界面的“加载”、“加载完成”等事件来帮助注册。2:“列表”等以前无法储存内容的控件,(即非默认内容后期赋的值)现在可直接赋值并保存到脚本结束(在按键中反复打开和关闭界面,内容还在),无需事件赋值。原因:脚本启动后界面自动触发“加载”和”加载完成“事件,故后期的赋值可保存到脚本结束。虽然以前也完成过,但按键精灵9.6的改动使得完成以上功能更为简便,故重新优化后发布。发现BUG:在”定时器“的”定时“事件中利用按键精灵自带插件,反复查找句柄时,句柄时常为空。因此在”列表“控制线程中,本人使用了其他插件来帮助查找句柄。热键版源码: Dimenv 全部窗口启动, 全部窗口暂停, 全部窗口继续, 全部窗口停止 Dimenv 指定窗口启动, 指定窗口暂停, 指定窗口继续, 指定窗口停止 Dimenv 全局句柄, 脚本开启状态 全部窗口启动 = 0 全部窗口暂停 = 0 全部窗口继续 = 0 全部窗口停止 = 0 指定窗口启动 = 0 指定窗口暂停 = 0 指定窗口继续 = 0 指定窗口停止 = 0 Dim Hwnd, 临时线程ID Dim 句柄线程存放数组() Dim 数组维数 Dim 指向窗口句柄, 指向窗口进程 Do WaitKey 临时句柄 = Plugin.Window.MousePoint() If 指定窗口启动 = 1 Or 指定窗口暂停 = 1 Or 指定窗口继续 = 1 Or 指定窗口停止 = 1 Then If 指定窗口启动 = 1 Then Call 指定窗口启动程序(临时句柄, 1) 指定窗口启动 = 0 ElseIf 指定窗口暂停 = 1 Then Call 指定窗口暂停程序(临时句柄, 1) 指定窗口暂停 = 0 ElseIf 指定窗口继续 = 1 Then Call 指定窗口继续程序(临时句柄, 1) 指定窗口继续 = 0 ElseIf 指定窗口停止 = 1 Then Call 指定窗口停止程序(临时句柄, 1) 指定窗口停止 = 0 End If ElseIf 全部窗口启动 = 1 Or 全部窗口暂停 = 1 Or 全部窗口继续 = 1 Or 全部窗口停止 = 1 Then If 全部窗口启动 = 1 Then Call 全部窗口启动程序 全部窗口启动 = 0 ElseIf 全部窗口暂停 = 1 Then Call 全部窗口暂停程序 全部窗口暂停 = 0 ElseIf 全部窗口继续 = 1 Then Call 全部窗口继续程序 全部窗口继续 = 0 ElseIf 全部窗口停止 = 1 Then Call 全部窗口停止程序 全部窗口停止 = 0 End If End If Loop Sub 测试线程 Dim Hwnd, i i=1 Hwnd = 全局句柄 脚本开启状态 = 1 Do Call Plugin.Bkgnd.SendString(Hwnd, i) Delay 50 Call Plugin.Bkgnd.KeyPress(Hwnd, 13) i = i + 1 Delay 500 Loop End Sub Sub 指定窗口启动程序(Hwnd, 提示类型) If Ubound(Filter(句柄线程存放数组, Hwnd, 2)) = -1 Then If IsEmpty(数组维数) = True Then 数组维数 = 0 Else 数组维数 = 数组维数 + 1 End If Redim Preserve 句柄线程存放数组(数组维数) 全局句柄 = Hwnd 临时线程ID = BeginThread(测试线程) 句柄线程存放数组(数组维数) = Hwnd & ":" & 临时线程ID Else If 提示类型 = 1 Then MessageBox "此窗口已启动过脚本!" End If End If End Sub Sub 指定窗口暂停程序(Hwnd, 提示类型) If Ubound(Filter(句柄线程存放数组, Hwnd, 2)) <> -1 Then 指向窗口句柄 = Split(Filter(句柄线程存放数组, Hwnd, 2)(0), ":")(0) 指向窗口进程 = Split(Filter(句柄线程存放数组, Hwnd, 2)(0), ":")(1) PauseThread 指向窗口进程 Else If 提示类型 = 1 Then MessageBox "此窗口未启动任何脚本!" End If End If End Sub Sub 指定窗口继续程序(Hwnd, 提示类型) If Ubound(Filter(句柄线程存放数组, Hwnd, 2)) <> -1 Then 指向窗口句柄 = Split(Filter(句柄线程存放数组, Hwnd, 2)(0), ":")(0) 指向窗口进程 = Split(Filter(句柄线程存放数组, Hwnd, 2)(0), ":")(1) ContinueThread 指向窗口进程 Else If 提示类型 = 1 Then MessageBox "此窗口未启动任何脚本!" End If End If End Sub Sub 指定窗口停止程序(Hwnd, 提示类型) Dim i, k If Ubound(Filter(句柄线程存放数组, Hwnd, 2)) <> -1 Then 指向窗口句柄 = Split(Filter(句柄线程存放数组, Hwnd, 2)(0), ":")(0) 指向窗口进程 = Split(Filter(句柄线程存放数组, Hwnd, 2)(0), ":")(1) StopThread 指向窗口进程 For i = 0 To UBound(句柄线程存放数组) If InStr(句柄线程存放数组(i), Hwnd) > 0 Then Exit For End If Next For k = i To UBound(句柄线程存放数组)-1 句柄线程存放数组(k) = 句柄线程存放数组(k + 1) Next 数组维数 = 数组维数 - 1 Redim Preserve 句柄线程存放数组(数组维数) Else If 提示类型 = 1 Then MessageBox "此窗口未启动任何脚本!" End If End If End Sub Sub 全部窗口启动程序 Dim AllHwnds, i AllHwnds = Plugin.Window.SearchEx("", "记事本", 0) For i = 0 To UBound(Split(AllHwnds, "|"))-1 TracePrint Split(AllHwnds, "|")(i) 临时句柄 = Plugin.Window.FindEx(Split(AllHwnds, "|")(i), 0, "Edit", "") 脚本开启状态 = 0 Call 指定窗口启动程序(临时句柄, 2) Do Delay 50 Loop Until 脚本开启状态 = 1 Next End Sub Sub 全部窗口暂停程序 Dim AllHwnds, i AllHwnds = Plugin.Window.SearchEx("", "记事本", 0) For i = 0 To UBound(Split(AllHwnds, "|"))-1 临时句柄 = Plugin.Window.FindEx(Split(AllHwnds, "|")(i), 0, "Edit", "") Call 指定窗口暂停程序(临时句柄, 2) Next End Sub Sub 全部窗口继续程序 Dim AllHwnds, i AllHwnds = Plugin.Window.SearchEx("", "记事本", 0) For i = 0 To UBound(Split(AllHwnds, "|"))-1 临时句柄 = Plugin.Window.FindEx(Split(AllHwnds, "|")(i), 0, "Edit", "") Call 指定窗口继续程序(临时句柄, 2) Next End Sub Sub 全部窗口停止程序 Dim AllHwnds, i AllHwnds = Plugin.Window.SearchEx("", "记事本", 0) For i = 0 To UBound(Split(AllHwnds, "|"))-1 临时句柄 = Plugin.Window.FindEx(Split(AllHwnds, "|")(i), 0, "Edit", "") Call 指定窗口停止程序(临时句柄, 2) Next End Sub Event Form1.指定窗口启动键.Change Form1.指定窗口启动键.Register True End Event Event Form1.指定窗口暂停键.Change Form1.指定窗口暂停键.Register True End Event Event Form1.指定窗口继续键.Change Form1.指定窗口继续键.Register True End Event Event Form1.指定窗口停止键.Change Form1.指定窗口停止键.Register True End Event Event Form1.指定窗口启动键.Hotkey 指定窗口启动 = 1 指定窗口暂停 = 0 指定窗口继续 = 0 指定窗口停止 = 0 End Event Event Form1.指定窗口暂停键.Hotkey 指定窗口启动 = 0 指定窗口暂停 = 1 指定窗口继续 = 0 指定窗口停止 = 0 End Event Event Form1.指定窗口继续键.Hotkey 指定窗口启动 = 0 指定窗口暂停 = 0 指定窗口继续 = 1 指定窗口停止 = 0 End Event Event Form1.指定窗口停止键.Hotkey 指定窗口启动 = 0 指定窗口暂停 = 0 指定窗口继续 = 0 指定窗口停止 = 1 End Event Event Form1.全部窗口启动.Click 全部窗口启动 = 1 全部窗口暂停 = 0 全部窗口继续 = 0 全部窗口停止 = 0 KeyPress "Ctrl", 1 End Event Event Form1.全部窗口暂停.Click 全部窗口启动 = 0 全部窗口暂停 = 1 全部窗口继续 = 0 全部窗口停止 = 0 KeyPress "Ctrl", 1 End Event Event Form1.全部窗口继续.Click 全部窗口启动 = 0 全部窗口暂停 = 0 全部窗口继续 = 1 全部窗口停止 = 0 KeyPress "Ctrl", 1 End Event Event Form1.全部窗口停止.Click 全部窗口启动 = 0 全部窗口暂停 = 0 全部窗口继续 = 0 全部窗口停止 = 1 KeyPress "Ctrl", 1 End Event Event Form1.LoadOver Form1.指定窗口启动键.Register True Form1.指定窗口暂停键.Register True Form1.指定窗口继续键.Register True Form1.指定窗口停止键.Register True End Event Event Form1.打开记事本.Click RunApp "NotePad.exe" End Event 列表版源码: Dim AllHwnds父, AllHwnds子, 临时句柄,i AllHwnds父 = Plugin.WndEx6.EnumWindowA(0, 0, "Notepad", 0) If UBound(AllHwnds父) <> - 1 Then AllHwnds子 = "" For i = 0 To UBound(AllHwnds父) 临时句柄 = Plugin.WndEx6.EnumWindowA(AllHwnds父(i), 0, "Edit", 0)(0) If AllHwnds子 = "" Then AllHwnds子 = 临时句柄 Else AllHwnds子 = AllHwnds子 & "|" & 临时句柄 End If Next Form1.句柄列表.List = AllHwnds子 End If Form1.读取信息定时器.Enabled = 1 Dimenv 全部窗口启动, 全部窗口暂停, 全部窗口继续, 全部窗口停止 Dimenv 选中窗口启动, 选中窗口暂停, 选中窗口继续, 选中窗口停止 Dimenv 全局句柄, 脚本开启状态 全部窗口启动 = 0 全部窗口暂停 = 0 全部窗口继续 = 0 全部窗口停止 = 0 选中窗口启动 = 0 选中窗口暂停 = 0 选中窗口继续 = 0 选中窗口停止 = 0 Dim Hwnd, 临时线程ID Dim 句柄线程存放数组() Dim 数组维数 Dim 选中窗口句柄, 选中窗口进程 Do WaitKey If 选中窗口启动 = 1 Or 选中窗口暂停 = 1 Or 选中窗口继续 = 1 Or 选中窗口停止 = 1 Then 临时句柄 = Clng(Split(Form1.句柄列表.List, "|")(Form1.句柄列表.ListIndex)) If 选中窗口启动 = 1 Then Call 选中窗口启动程序(临时句柄, 1) 选中窗口启动 = 0 ElseIf 选中窗口暂停 = 1 Then Call 选中窗口暂停程序(临时句柄, 1) 选中窗口暂停 = 0 ElseIf 选中窗口继续 = 1 Then Call 选中窗口继续程序(临时句柄, 1) 选中窗口继续 = 0 ElseIf 选中窗口停止 = 1 Then Call 选中窗口停止程序(临时句柄, 1) 选中窗口停止 = 0 End If ElseIf 全部窗口启动 = 1 Or 全部窗口暂停 = 1 Or 全部窗口继续 = 1 Or 全部窗口停止 = 1 Then If 全部窗口启动 = 1 Then Call 全部窗口启动程序 全部窗口启动 = 0 ElseIf 全部窗口暂停 = 1 Then Call 全部窗口暂停程序 全部窗口暂停 = 0 ElseIf 全部窗口继续 = 1 Then Call 全部窗口继续程序 全部窗口继续 = 0 ElseIf 全部窗口停止 = 1 Then Call 全部窗口停止程序 全部窗口停止 = 0 End If End If Loop Sub 测试线程 Dim Hwnd, i i=1 Hwnd = 全局句柄 脚本开启状态 = 1 Do Call Plugin.Bkgnd.SendString(Hwnd, i) Delay 50 Call Plugin.Bkgnd.KeyPress(Hwnd, 13) i = i + 1 Delay 500 Loop End Sub Sub 选中窗口启动程序(Hwnd, 提示类型) If Ubound(Filter(句柄线程存放数组, Hwnd, 2)) = -1 Then If IsEmpty(数组维数) = True Then 数组维数 = 0 Else 数组维数 = 数组维数 + 1 End If Redim Preserve 句柄线程存放数组(数组维数) 全局句柄 = Hwnd 临时线程ID = BeginThread(测试线程) 句柄线程存放数组(数组维数) = Hwnd & ":" & 临时线程ID Else If 提示类型 = 1 Then MessageBox "此窗口已启动过脚本!" End If End If End Sub Sub 选中窗口暂停程序(Hwnd, 提示类型) If Ubound(Filter(句柄线程存放数组, Hwnd, 2)) <> -1 Then 选中窗口句柄 = Split(Filter(句柄线程存放数组, Hwnd, 2)(0), ":")(0) 选中窗口进程 = Split(Filter(句柄线程存放数组, Hwnd, 2)(0), ":")(1) PauseThread 选中窗口进程 Else If 提示类型 = 1 Then MessageBox "此窗口未启动任何脚本!" End If End If End Sub Sub 选中窗口继续程序(Hwnd, 提示类型) If Ubound(Filter(句柄线程存放数组, Hwnd, 2)) <> -1 Then 选中窗口句柄 = Split(Filter(句柄线程存放数组, Hwnd, 2)(0), ":")(0) 选中窗口进程 = Split(Filter(句柄线程存放数组, Hwnd, 2)(0), ":")(1) ContinueThread 选中窗口进程 Else If 提示类型 = 1 Then MessageBox "此窗口未启动任何脚本!" End If End If End Sub Sub 选中窗口停止程序(Hwnd, 提示类型) Dim i, k If Ubound(Filter(句柄线程存放数组, Hwnd, 2)) <> -1 Then 选中窗口句柄 = Split(Filter(句柄线程存放数组, Hwnd, 2)(0), ":")(0) 选中窗口进程 = Split(Filter(句柄线程存放数组, Hwnd, 2)(0), ":")(1) StopThread 选中窗口进程 For i = 0 To UBound(句柄线程存放数组) If InStr(句柄线程存放数组(i), Hwnd) > 0 Then Exit For End If Next For k = i To UBound(句柄线程存放数组)-1 句柄线程存放数组(k) = 句柄线程存放数组(k + 1) Next 数组维数 = 数组维数 - 1 Redim Preserve 句柄线程存放数组(数组维数) Else If 提示类型 = 1 Then MessageBox "此窗口未启动任何脚本!" End If End If End Sub Sub 全部窗口启动程序 Dim AllHwnds, 临时句柄, i AllHwnds = Plugin.WndEx6.EnumWindowA(0, 0, "Notepad", 0) For i = 0 To UBound(AllHwnds) 临时句柄 = Plugin.WndEx6.EnumWindowA(AllHwnds(i), 0, "Edit", 0)(0) 脚本开启状态 = 0 Call 选中窗口启动程序(临时句柄, 2) Do Delay 50 Loop Until 脚本开启状态 = 1 Next End Sub Sub 全部窗口暂停程序 Dim AllHwnds, 临时句柄, i AllHwnds = Plugin.WndEx6.EnumWindowA(0, 0, "Notepad", 0) For i = 0 To UBound(AllHwnds) 临时句柄 = Plugin.WndEx6.EnumWindowA(AllHwnds(i), 0, "Edit", 0)(0) Call 选中窗口暂停程序(临时句柄, 2) Next End Sub Sub 全部窗口继续程序 Dim AllHwnds, 临时句柄, i AllHwnds = Plugin.WndEx6.EnumWindowA(0, 0, "Notepad", 0) For i = 0 To UBound(AllHwnds) 临时句柄 = Plugin.WndEx6.EnumWindowA(AllHwnds(i), 0, "Edit", 0)(0) Call 选中窗口继续程序(临时句柄, 2) Next End Sub Sub 全部窗口停止程序 Dim AllHwnds, 临时句柄, i AllHwnds = Plugin.WndEx6.EnumWindowA(0, 0, "Notepad", 0) For i = 0 To UBound(AllHwnds) 临时句柄 = Plugin.WndEx6.EnumWindowA(AllHwnds(i), 0, "Edit", 0)(0) Call 选中窗口停止程序(临时句柄, 2) Next End Sub Event Form1.选中窗口启动.Click 选中窗口启动 = 1 选中窗口暂停 = 0 选中窗口继续 = 0 选中窗口停止 = 0 KeyPress "Ctrl", 1 End Event Event Form1.选中窗口暂停.Click 选中窗口启动 = 0 选中窗口暂停 = 1 选中窗口继续 = 0 选中窗口停止 = 0 KeyPress "Ctrl", 1 End Event Event Form1.选中窗口继续.Click 选中窗口启动 = 0 选中窗口暂停 = 0 选中窗口继续 = 1 选中窗口停止 = 0 KeyPress "Ctrl", 1 End Event Event Form1.选中窗口停止.Click 选中窗口启动 = 0 选中窗口暂停 = 0 选中窗口继续 = 0 选中窗口停止 = 1 KeyPress "Ctrl", 1 End Event Event Form1.全部窗口启动.Click 全部窗口启动 = 1 全部窗口暂停 = 0 全部窗口继续 = 0 全部窗口停止 = 0 KeyPress "Ctrl", 1 End Event Event Form1.全部窗口暂停.Click 全部窗口启动 = 0 全部窗口暂停 = 1 全部窗口继续 = 0 全部窗口停止 = 0 KeyPress "Ctrl", 1 End Event Event Form1.全部窗口继续.Click 全部窗口启动 = 0 全部窗口暂停 = 0 全部窗口继续 = 1 全部窗口停止 = 0 KeyPress "Ctrl", 1 End Event Event Form1.全部窗口停止.Click 全部窗口启动 = 0 全部窗口暂停 = 0 全部窗口继续 = 0 全部窗口停止 = 1 KeyPress "Ctrl", 1 End Event Event Form1.读取信息定时器.Timer Dim AllHwnds父, AllHwnds子, 临时句柄, 分割列表, 分割句柄, i AllHwnds父 = Plugin.WndEx6.EnumWindowA(0, 0, "Notepad", 0) If UBound(AllHwnds父) <> - 1 Then AllHwnds子 = "" For i = 0 To UBound(AllHwnds父) 临时句柄 = Plugin.WndEx6.EnumWindowA(AllHwnds父(i), 0, "Edit", 0)(0) If AllHwnds子 = "" Then AllHwnds子 = 临时句柄 Else AllHwnds子 = AllHwnds子 & "|" & 临时句柄 End If Next //获取记事本可输入文字的句柄组 分割句柄 = Split(AllHwnds子, "|") For i = 0 To UBound(分割句柄) If Instr(Form1.句柄列表.List, 分割句柄(i)) > 0 Then Else Form1.句柄列表.AddItem 分割句柄(i) End If Next //添加现有句柄到列表 分割列表 = Split(Form1.句柄列表.List, "|") For i = 0 To UBound(分割列表) If UBound(Filter(分割句柄, 分割列表(i), 2)) = - 1 Then Form1.句柄列表.RemoveItem i End If Next //删除列表中不存在的句柄 Else Form1.句柄列表.List = "" End If End Event Event Form1.句柄列表.DblClick Dim 选中句柄 选中句柄 = Clng(Split(Form1.句柄列表.List, "|")(Form1.句柄列表.ListIndex)) Plugin.WndEx6.SetWindowState 选中句柄,1 For 4 Plugin.WndEx6.HighlightWindow 选中句柄, 4, "800080", 80 Delay 50 Next End Event Sub OnScriptExit() Form1.读取信息定时器.Enabled = 0 Form1.句柄列表.List = "" End Sub Sub OnScriptLoad() sPath = Plugin.Sys.GetDir(0) PutAttachment sPath & "\plugin", "WndEx6.dll" End Sub Event Form1.打开记事本.Click RunApp "NotePad.exe" End Event

(0)

相关推荐

  • 忘记一键还原精灵装机版备份文件放哪里的两种解决方案

    一键还原精灵是一款傻瓜似的系统还原工具,它具有方便.安全.快速等特点,特别适合电脑新手和电脑频繁中毒的用户使用.有不少朋友在用一键还原精灵装机版的备份文件时,忘记了文件的所在位置.小编针对这一问题整理 ...

  • 用网页按键精灵自动申请QQ号秘笈

    由此我们也不难看出这款多次获得过优秀软件大奖的国产精品软件是多么的风靡。 的确,“按键精灵”是一款非常不错的免费脚本软件,它不仅在各类网络游戏中有着上千种不同的精妙应用,而且在普通的电脑操作中,它也可 ...

  • 按键精灵工具命令生成器的设置技巧

    网友在使用按键精灵这款软件的时候,通过工具命令生成器,不仅可以设置键盘动作,还可以进行鼠标动作等设置.今天,我们就以键盘动作.鼠标点击.鼠标移动等动作为例子,为大家讲解工具命令生成器的设置技巧,希望大 ...

  • 按键精灵自动申请QQ帐号的脚本设置方法

    按键精灵是一款功能非常强大的软件,相信很多人都会使用这款软件来制作一些指定动作脚本,来减少自己的工作重复量,比如,可以自动登录QQ,自动登录各类邮箱.自动清除Prefetch文件夹内容.而更加强大的是 ...

  • 按键精灵开发教程:解决获取不到网页源文件

    使用命令库里的获取网页源文件,提示没有权限访问?返回值是空的?又或者,网页的内容变化了,但是获取到的网页源文件一直都是第一次启动时获取到的?这么多症状,还有得救吗?小编今天分享药方三帖.这三种方法,小 ...

  • 学习游戏脚本制作:解析按键精灵里的if语句

    学习游戏脚本制作:解析按键精灵里的if语句 操作方法 01 1.If--end if  判断语句(If判断语句,有分为两种) (1)  if语句条 :当判断完之后,要执行的语句只有一条的时候,使用if ...

  • 按键精灵如何设置时间间隔

    按键精灵可以模拟鼠标和键盘的动作,通过按键精灵制作脚本,可以在一定程度上可以解放我们的双手,那么按键精灵怎样设置时间间隔呢?现在就为大家介绍一下,如何输入时间间隔 操作方法 01 打开或者新建一个脚本 ...

  • 游戏辅助:用按键精灵制作DNF遍历背包卖物脚本

    游戏挂机一段时间,号子上的背包满了怎么办?我们需要清理背包,该分解的分解该卖的卖. 清理背包第一步:遍历背包 第二步:判断背包格里是否有物品 第三步:判断物品的名称等级 第四步:执行清包操作. 具体该 ...

  • 按键精灵安卓版怎么用?

    随着手机的普及,现在按键精灵也出现了安卓版,就让我来为大家普及一下按键精灵安卓版怎么操作! 操作方法 01 打开手机上的按键精灵,与电脑版本一样,也有两种编写脚本的方法,一种是录制脚本,另外一种是直接 ...