经常有人问我这个问题,现在特别把这个方法说一下。

 

比如有3个窗口,分别对应三个线程,分别控制窗口脚本。

 

那如何解决3个窗口图色,键鼠操作的冲突呢? 下面就是一个完整的前台切换3开模版. 用按键精灵的语法描述,其他语言类似.

主要是利用4.1320版本之后EnterCriLeaveCri来实现.(类似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