经常有人问我这个问题,现在特别把这个方法说一下。
比如有3个窗口,分别对应三个线程,分别控制窗口脚本。
那如何解决3个窗口图色,键鼠操作的冲突呢? 下面就是一个完整的前台切换3开模版. 用按键精灵的语法描述,其他语言类似.
主要是利用4.1320版本之后EnterCri和LeaveCri来实现.(类似E语言许可证的概念)
//之前插件的释放和注册部分省略
Set dm = createobject("dm.dmsoft")
dm_ret =
dm.Reg("你的注册码","")
if dm_ret <> 1 then
messagebox "注册失败:"&dm_ret
endscript
end if
hwnds = dm.EnumWindow(0,"QQ三国","",1+4+8+16)
hwnds = split(hwnds,",")
if ubound(hwnds) <> 2 then
messagebox "没发现3个窗口"
endscript
end if
// 这里初始化临界区
dm.InitCri
// 分别开启3个线程控制每个窗口
BeginThread entry(clng(hwnds(0))
BeginThread entry(clng(hwnds(1))
BeginThread entry(clng(hwnds(2))
do
delay 1000
loop
endscript
sub entry(hwnd)
TracePrint "句柄:"&hwnd
set dm = createobject("dm.dmsoft")
dm_ret = dm.BindWindow(hwnd,"normal","normal","normal",0)
do
Call 接任务()
Call 打怪()
Call 交任务()
loop
end sub
Sub接任务()
// 激活和取消激活必须成对调用. 否则脚本会卡死
call 激活窗口()
// 这里就是接任务代码.这里只是一个例子,实际中不可能整个接任务代码都被保护起来,那样太低效了.
call 取消激活窗口()
End Sub
Sub 打怪()
// 激活和取消激活必须成对调用. 否则脚本会卡死
call 激活窗口()
// 这里就是打怪代码
call 取消激活窗口()
End Sub
Sub 交任务()
// 激活和取消激活必须成对调用. 否则脚本会卡死
call 激活窗口()
// 这里就是交任务代码
call 取消激活窗口()
End Sub
Sub 激活窗口()
do
if dm.EnterCri() = 1 then
exit do
end if
delay 100
loop
dm.SetWindowState hwnd,12
delay 500
End Sub
Sub 取消激活窗口()
dm.LeaveCri
End Sub
Sub OnThreadExit()
dm.UnBindWindow
end Sub