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

 时间:2024-10-12 06:28:46

脚本特色:*支持单控恽但炎杰和全部一次性控制的操作,不会冲突,不会重复启动。*”热键“版特色,方便用户指定窗口直接启动。*”列表“版特色,实时更新、添加、删除句柄,用户可选中句柄点击操作,母皿钟床双击句柄会自动显示句柄并绘图提醒。在本人测试的期间发现如下改动:1:“热键”控件,支持“热键”事件触发“热键”的注册。即修改了“热键”的按键码后脚本下次启动的时候即可生效,无需其他”事件“来帮助注册。以前需要“按钮”的点击、界面的“加载”、“加载完成”等事件来帮助注册。2:“列表”等以前无法储存内容的控件,(即非默认内容后期赋的值)现在可直接赋值并保存到脚本结束(在按键中反复打开和关闭界面,内容还在),无需事件赋值。原因:脚本启动后界面自动触发“加载”和”加载完成“事件,故后期的赋值可保存到脚本结束。虽然以前也完成过,但按键精灵9.6的改动使得完成以上功能更为简便,故重新优化后发布。发现BUG:在”定时器“的”定时“事件中利用按键精灵自带插件,反复查找句柄时,句柄时常为空。因此在”列表“控制线程中,本人使用了其他插件来帮助查找句柄。热键版源码:

Dimenv全部窗口启动,全部窗口暂停,全部窗口继续,全部窗口停止

Dimenv指定窗口启动,指定窗口暂停,指定窗口继续,指定窗口停止

Dimenv全局句柄,脚本开启状态

全部窗口启动=0

全部窗口暂停=0

全部窗口继续=0

全部窗口停止=0

指定窗口启动=0

指定窗口暂停=0

指定窗口继续=0

指定窗口停止=0

DimHwnd,临时线程ID

Dim句柄线程存放数组()

Dim数组维数

Dim指向窗口句柄,指向窗口进程

Do

WaitKey

临时句柄=Plugin.Window.MousePoint()

If指定窗口启动=1Or指定窗口暂停=1Or指定窗口继续=1Or指定窗口停止=1Then

If指定窗口启动=1Then

Call指定窗口启动程序(临时句柄,1)

指定窗口启动=0

ElseIf指定窗口暂停=1Then

Call指定窗口暂停程序(临时句柄,1)

指定窗口暂停=0

ElseIf指定窗口继续=1Then

Call指定窗口继续程序(临时句柄,1)

指定窗口继续=0

ElseIf指定窗口停止=1Then

Call指定窗口停止程序(临时句柄,1)

指定窗口停止=0

EndIf

ElseIf全部窗口启动=1Or全部窗口暂停=1Or全部窗口继续=1Or全部窗口停止=1Then

If全部窗口启动=1Then

Call全部窗口启动程序

全部窗口启动=0

ElseIf全部窗口暂停=1Then

Call全部窗口暂停程序

全部窗口暂停=0

ElseIf全部窗口继续=1Then

Call全部窗口继续程序

全部窗口继续=0

ElseIf全部窗口停止=1Then

Call全部窗口停止程序

全部窗口停止=0

EndIf

EndIf

Loop

Sub测试线程

DimHwnd,i

i=1

Hwnd=全局句柄

脚本开启状态=1

Do

CallPlugin.Bkgnd.SendString(Hwnd,i)

Delay50

CallPlugin.Bkgnd.KeyPress(Hwnd,13)

i=i+1

Delay500

Loop

EndSub

Sub指定窗口启动程序(Hwnd,提示类型)

IfUbound(Filter(句柄线程存放数组,Hwnd,2))=-1Then

IfIsEmpty(数组维数)=TrueThen

数组维数=0

Else

数组维数=数组维数+1

EndIf

RedimPreserve句柄线程存放数组(数组维数)

全局句柄=Hwnd

临时线程ID=BeginThread(测试线程)

句柄线程存放数组(数组维数)=Hwnd&":"&临时线程ID

Else

If提示类型=1Then

MessageBox"此窗口已启动过脚本!"

EndIf

EndIf

EndSub

Sub指定窗口暂停程序(Hwnd,提示类型)

IfUbound(Filter(句柄线程存放数组,Hwnd,2))<>-1Then

指向窗口句柄=Split(Filter(句柄线程存放数组,Hwnd,2)(0),":")(0)

指向窗口进程=Split(Filter(句柄线程存放数组,Hwnd,2)(0),":")(1)

PauseThread指向窗口进程

Else

If提示类型=1Then

MessageBox"此窗口未启动任何脚本!"

EndIf

EndIf

EndSub

Sub指定窗口继续程序(Hwnd,提示类型)

IfUbound(Filter(句柄线程存放数组,Hwnd,2))<>-1Then

指向窗口句柄=Split(Filter(句柄线程存放数组,Hwnd,2)(0),":")(0)

指向窗口进程=Split(Filter(句柄线程存放数组,Hwnd,2)(0),":")(1)

ContinueThread指向窗口进程

Else

If提示类型=1Then

MessageBox"此窗口未启动任何脚本!"

EndIf

EndIf

EndSub

Sub指定窗口停止程序(Hwnd,提示类型)

Dimi,k

IfUbound(Filter(句柄线程存放数组,Hwnd,2))<>-1Then

指向窗口句柄=Split(Filter(句柄线程存放数组,Hwnd,2)(0),":")(0)

指向窗口进程=Split(Filter(句柄线程存放数组,Hwnd,2)(0),":")(1)

StopThread指向窗口进程

Fori=0ToUBound(句柄线程存放数组)

IfInStr(句柄线程存放数组(i),Hwnd)>0Then

ExitFor

EndIf

Next

Fork=iToUBound(句柄线程存放数组)-1

句柄线程存放数组(k)=句柄线程存放数组(k+1)

Next

数组维数=数组维数-1

RedimPreserve句柄线程存放数组(数组维数)

Else

If提示类型=1Then

MessageBox"此窗口未启动任何脚本!"

EndIf

EndIf

EndSub

Sub全部窗口启动程序

DimAllHwnds,i

AllHwnds=Plugin.Window.SearchEx("","记事本",0)

Fori=0ToUBound(Split(AllHwnds,"|"))-1

TracePrintSplit(AllHwnds,"|")(i)

临时句柄=Plugin.Window.FindEx(Split(AllHwnds,"|")(i),0,"Edit","")

脚本开启状态=0

Call指定窗口启动程序(临时句柄,2)

Do

Delay50

LoopUntil脚本开启状态=1

Next

EndSub

Sub全部窗口暂停程序

DimAllHwnds,i

AllHwnds=Plugin.Window.SearchEx("","记事本",0)

Fori=0ToUBound(Split(AllHwnds,"|"))-1

临时句柄=Plugin.Window.FindEx(Split(AllHwnds,"|")(i),0,"Edit","")

Call指定窗口暂停程序(临时句柄,2)

Next

EndSub

Sub全部窗口继续程序

DimAllHwnds,i

AllHwnds=Plugin.Window.SearchEx("","记事本",0)

Fori=0ToUBound(Split(AllHwnds,"|"))-1

临时句柄=Plugin.Window.FindEx(Split(AllHwnds,"|")(i),0,"Edit","")

Call指定窗口继续程序(临时句柄,2)

Next

EndSub

Sub全部窗口停止程序

DimAllHwnds,i

AllHwnds=Plugin.Window.SearchEx("","记事本",0)

Fori=0ToUBound(Split(AllHwnds,"|"))-1

临时句柄=Plugin.Window.FindEx(Split(AllHwnds,"|")(i),0,"Edit","")

Call指定窗口停止程序(临时句柄,2)

Next

EndSub

EventForm1.指定窗口启动键.Change

Form1.指定窗口启动键.RegisterTrue

EndEvent

EventForm1.指定窗口暂停键.Change

Form1.指定窗口暂停键.RegisterTrue

EndEvent

EventForm1.指定窗口继续键.Change

Form1.指定窗口继续键.RegisterTrue

EndEvent

EventForm1.指定窗口停止键.Change

Form1.指定窗口停止键.RegisterTrue

EndEvent

EventForm1.指定窗口启动键.Hotkey

指定窗口启动=1

指定窗口暂停=0

指定窗口继续=0

指定窗口停止=0

EndEvent

EventForm1.指定窗口暂停键.Hotkey

指定窗口启动=0

指定窗口暂停=1

指定窗口继续=0

指定窗口停止=0

EndEvent

EventForm1.指定窗口继续键.Hotkey

指定窗口启动=0

指定窗口暂停=0

指定窗口继续=1

指定窗口停止=0

EndEvent

EventForm1.指定窗口停止键.Hotkey

指定窗口启动=0

指定窗口暂停=0

指定窗口继续=0

指定窗口停止=1

EndEvent

EventForm1.全部窗口启动.Click

全部窗口启动=1

全部窗口暂停=0

全部窗口继续=0

全部窗口停止=0

KeyPress"Ctrl",1

EndEvent

EventForm1.全部窗口暂停.Click

全部窗口启动=0

全部窗口暂停=1

全部窗口继续=0

全部窗口停止=0

KeyPress"Ctrl",1

EndEvent

EventForm1.全部窗口继续.Click

全部窗口启动=0

全部窗口暂停=0

全部窗口继续=1

全部窗口停止=0

KeyPress"Ctrl",1

EndEvent

EventForm1.全部窗口停止.Click

全部窗口启动=0

全部窗口暂停=0

全部窗口继续=0

全部窗口停止=1

KeyPress"Ctrl",1

EndEvent

EventForm1.LoadOver

Form1.指定窗口启动键.RegisterTrue

Form1.指定窗口暂停键.RegisterTrue

Form1.指定窗口继续键.RegisterTrue

Form1.指定窗口停止键.RegisterTrue

EndEvent

EventForm1.打开记事本.Click

RunApp"NotePad.exe"

EndEvent

列表版源码:

DimAllHwnds父,AllHwnds子,临时句柄,i

AllHwnds父=Plugin.WndEx6.EnumWindowA(0,0,"Notepad",0)

IfUBound(AllHwnds父)<>-1Then

AllHwnds子=""

Fori=0ToUBound(AllHwnds父)

临时句柄=Plugin.WndEx6.EnumWindowA(AllHwnds父(i),0,"Edit",0)(0)

IfAllHwnds子=""Then

AllHwnds子=临时句柄

Else

AllHwnds子=AllHwnds子&"|"&临时句柄

EndIf

Next

Form1.句柄列表.List=AllHwnds子

EndIf

Form1.读取信息定时器.Enabled=1

Dimenv全部窗口启动,全部窗口暂停,全部窗口继续,全部窗口停止

Dimenv选中窗口启动,选中窗口暂停,选中窗口继续,选中窗口停止

Dimenv全局句柄,脚本开启状态

全部窗口启动=0

全部窗口暂停=0

全部窗口继续=0

全部窗口停止=0

选中窗口启动=0

选中窗口暂停=0

选中窗口继续=0

选中窗口停止=0

DimHwnd,临时线程ID

Dim句柄线程存放数组()

Dim数组维数

Dim选中窗口句柄,选中窗口进程

Do

WaitKey

If选中窗口启动=1Or选中窗口暂停=1Or选中窗口继续=1Or选中窗口停止=1Then

临时句柄=Clng(Split(Form1.句柄列表.List,"|")(Form1.句柄列表.ListIndex))

If选中窗口启动=1Then

Call选中窗口启动程序(临时句柄,1)

选中窗口启动=0

ElseIf选中窗口暂停=1Then

Call选中窗口暂停程序(临时句柄,1)

选中窗口暂停=0

ElseIf选中窗口继续=1Then

Call选中窗口继续程序(临时句柄,1)

选中窗口继续=0

ElseIf选中窗口停止=1Then

Call选中窗口停止程序(临时句柄,1)

选中窗口停止=0

EndIf

ElseIf全部窗口启动=1Or全部窗口暂停=1Or全部窗口继续=1Or全部窗口停止=1Then

If全部窗口启动=1Then

Call全部窗口启动程序

全部窗口启动=0

ElseIf全部窗口暂停=1Then

Call全部窗口暂停程序

全部窗口暂停=0

ElseIf全部窗口继续=1Then

Call全部窗口继续程序

全部窗口继续=0

ElseIf全部窗口停止=1Then

Call全部窗口停止程序

全部窗口停止=0

EndIf

EndIf

Loop

Sub测试线程

DimHwnd,i

i=1

Hwnd=全局句柄

脚本开启状态=1

Do

CallPlugin.Bkgnd.SendString(Hwnd,i)

Delay50

CallPlugin.Bkgnd.KeyPress(Hwnd,13)

i=i+1

Delay500

Loop

EndSub

Sub选中窗口启动程序(Hwnd,提示类型)

IfUbound(Filter(句柄线程存放数组,Hwnd,2))=-1Then

IfIsEmpty(数组维数)=TrueThen

数组维数=0

Else

数组维数=数组维数+1

EndIf

RedimPreserve句柄线程存放数组(数组维数)

全局句柄=Hwnd

临时线程ID=BeginThread(测试线程)

句柄线程存放数组(数组维数)=Hwnd&":"&临时线程ID

Else

If提示类型=1Then

MessageBox"此窗口已启动过脚本!"

EndIf

EndIf

EndSub

Sub选中窗口暂停程序(Hwnd,提示类型)

IfUbound(Filter(句柄线程存放数组,Hwnd,2))<>-1Then

选中窗口句柄=Split(Filter(句柄线程存放数组,Hwnd,2)(0),":")(0)

选中窗口进程=Split(Filter(句柄线程存放数组,Hwnd,2)(0),":")(1)

PauseThread选中窗口进程

Else

If提示类型=1Then

MessageBox"此窗口未启动任何脚本!"

EndIf

EndIf

EndSub

Sub选中窗口继续程序(Hwnd,提示类型)

IfUbound(Filter(句柄线程存放数组,Hwnd,2))<>-1Then

选中窗口句柄=Split(Filter(句柄线程存放数组,Hwnd,2)(0),":")(0)

选中窗口进程=Split(Filter(句柄线程存放数组,Hwnd,2)(0),":")(1)

ContinueThread选中窗口进程

Else

If提示类型=1Then

MessageBox"此窗口未启动任何脚本!"

EndIf

EndIf

EndSub

Sub选中窗口停止程序(Hwnd,提示类型)

Dimi,k

IfUbound(Filter(句柄线程存放数组,Hwnd,2))<>-1Then

选中窗口句柄=Split(Filter(句柄线程存放数组,Hwnd,2)(0),":")(0)

选中窗口进程=Split(Filter(句柄线程存放数组,Hwnd,2)(0),":")(1)

StopThread选中窗口进程

Fori=0ToUBound(句柄线程存放数组)

IfInStr(句柄线程存放数组(i),Hwnd)>0Then

ExitFor

EndIf

Next

Fork=iToUBound(句柄线程存放数组)-1

句柄线程存放数组(k)=句柄线程存放数组(k+1)

Next

数组维数=数组维数-1

RedimPreserve句柄线程存放数组(数组维数)

Else

If提示类型=1Then

MessageBox"此窗口未启动任何脚本!"

EndIf

EndIf

EndSub

Sub全部窗口启动程序

DimAllHwnds,临时句柄,i

AllHwnds=Plugin.WndEx6.EnumWindowA(0,0,"Notepad",0)

Fori=0ToUBound(AllHwnds)

临时句柄=Plugin.WndEx6.EnumWindowA(AllHwnds(i),0,"Edit",0)(0)

脚本开启状态=0

Call选中窗口启动程序(临时句柄,2)

Do

Delay50

LoopUntil脚本开启状态=1

Next

EndSub

Sub全部窗口暂停程序

DimAllHwnds,临时句柄,i

AllHwnds=Plugin.WndEx6.EnumWindowA(0,0,"Notepad",0)

Fori=0ToUBound(AllHwnds)

临时句柄=Plugin.WndEx6.EnumWindowA(AllHwnds(i),0,"Edit",0)(0)

Call选中窗口暂停程序(临时句柄,2)

Next

EndSub

Sub全部窗口继续程序

DimAllHwnds,临时句柄,i

AllHwnds=Plugin.WndEx6.EnumWindowA(0,0,"Notepad",0)

Fori=0ToUBound(AllHwnds)

临时句柄=Plugin.WndEx6.EnumWindowA(AllHwnds(i),0,"Edit",0)(0)

Call选中窗口继续程序(临时句柄,2)

Next

EndSub

Sub全部窗口停止程序

DimAllHwnds,临时句柄,i

AllHwnds=Plugin.WndEx6.EnumWindowA(0,0,"Notepad",0)

Fori=0ToUBound(AllHwnds)

临时句柄=Plugin.WndEx6.EnumWindowA(AllHwnds(i),0,"Edit",0)(0)

Call选中窗口停止程序(临时句柄,2)

Next

EndSub

EventForm1.选中窗口启动.Click

选中窗口启动=1

选中窗口暂停=0

选中窗口继续=0

选中窗口停止=0

KeyPress"Ctrl",1

EndEvent

EventForm1.选中窗口暂停.Click

选中窗口启动=0

选中窗口暂停=1

选中窗口继续=0

选中窗口停止=0

KeyPress"Ctrl",1

EndEvent

EventForm1.选中窗口继续.Click

选中窗口启动=0

选中窗口暂停=0

选中窗口继续=1

选中窗口停止=0

KeyPress"Ctrl",1

EndEvent

EventForm1.选中窗口停止.Click

选中窗口启动=0

选中窗口暂停=0

选中窗口继续=0

选中窗口停止=1

KeyPress"Ctrl",1

EndEvent

EventForm1.全部窗口启动.Click

全部窗口启动=1

全部窗口暂停=0

全部窗口继续=0

全部窗口停止=0

KeyPress"Ctrl",1

EndEvent

EventForm1.全部窗口暂停.Click

全部窗口启动=0

全部窗口暂停=1

全部窗口继续=0

全部窗口停止=0

KeyPress"Ctrl",1

EndEvent

EventForm1.全部窗口继续.Click

全部窗口启动=0

全部窗口暂停=0

全部窗口继续=1

全部窗口停止=0

KeyPress"Ctrl",1

EndEvent

EventForm1.全部窗口停止.Click

全部窗口启动=0

全部窗口暂停=0

全部窗口继续=0

全部窗口停止=1

KeyPress"Ctrl",1

EndEvent

EventForm1.读取信息定时器.Timer

DimAllHwnds父,AllHwnds子,临时句柄,分割列表,分割句柄,i

AllHwnds父=Plugin.WndEx6.EnumWindowA(0,0,"Notepad",0)

IfUBound(AllHwnds父)<>-1Then

AllHwnds子=""

Fori=0ToUBound(AllHwnds父)

临时句柄=Plugin.WndEx6.EnumWindowA(AllHwnds父(i),0,"Edit",0)(0)

IfAllHwnds子=""Then

AllHwnds子=临时句柄

Else

AllHwnds子=AllHwnds子&"|"&临时句柄

EndIf

Next

//获取记事本可输入文字的句柄组

分割句柄=Split(AllHwnds子,"|")

Fori=0ToUBound(分割句柄)

IfInstr(Form1.句柄列表.List,分割句柄(i))>0Then

Else

Form1.句柄列表.AddItem分割句柄(i)

EndIf

Next

//添加现有句柄到列表

分割列表=Split(Form1.句柄列表.List,"|")

Fori=0ToUBound(分割列表)

IfUBound(Filter(分割句柄,分割列表(i),2))=-1Then

Form1.句柄列表.RemoveItemi

EndIf

Next

//删除列表中不存在的句柄

Else

Form1.句柄列表.List=""

EndIf

EndEvent

EventForm1.句柄列表.DblClick

Dim选中句柄

选中句柄=Clng(Split(Form1.句柄列表.List,"|")(Form1.句柄列表.ListIndex))

Plugin.WndEx6.SetWindowState选中句柄,1

For4

Plugin.WndEx6.HighlightWindow选中句柄,4,"800080",80

Delay50

Next

EndEvent

SubOnScriptExit()

Form1.读取信息定时器.Enabled=0

Form1.句柄列表.List=""

EndSub

SubOnScriptLoad()

sPath=Plugin.Sys.GetDir(0)

PutAttachmentsPath&"\plugin","WndEx6.dll"

EndSub

EventForm1.打开记事本.Click

RunApp"NotePad.exe"

EndEvent

xxxxxx.dll文件丢失的解决方法 易语言分组框设置标题颜色 按键精灵如何找色,找图,找字 龙之谷无尽Boss方块技能攻略 如何使用windows 2003做软RAID (0,1,5)
热门搜索
水螅图片 摩托车价格及图片 正常舌苔图片 英雄联盟召唤师图标 红绿灯图片