脚本特色:*支持单控恽但炎杰和全部一次性控制的操作,不会冲突,不会重复启动。*”热键“版特色,方便用户指定窗口直接启动。*”列表“版特色,实时更新、添加、删除句柄,用户可选中句柄点击操作,母皿钟床双击句柄会自动显示句柄并绘图提醒。在本人测试的期间发现如下改动: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