按键精灵多线程的两种控制方法
操作方法
- 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