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

时间:2024-10-12 01:53:34

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

© 手抄报圈