addz1122 发表于 2009-6-17 14:15:40

关于弹出新窗口后命令失效的问题

本人初学AutoIt,在编写了一些脚本后发现一个问题,就是当程序自动运行到需要弹出新窗口这个步骤时,窗口弹出后,就不继续自动执行了,这个问题发现不止一次了,请各位给指点一下,谢谢!代码如下 :
AdlibEnable("myadlib")
RunWait(@ComSpec & " /c .\JrscCtrl.msi ","",@SW_HIDE)
Func myadlib()
    If WinActive("JrscCtrl","选择是否要修复或移除 JrscCtrl。") Then
           WinClose("JrscCtrl","选择是否要修复或移除 JrscCtrl。")
           MsgBox(0,"","您已经安装了该插件")
      Exit ;如果出现已经安装的提示窗口,就推出安装
        ElseIf WinActive("JrscCtrl","下一步") Then
               WinWaitActive("JrscCtrl","下一步")
send("!N")
WinWaitActive("JrscCtrl","下一步")
send("!N")
WinWaitActive("JrscCtrl","下一步")
send("!N")
While WinWaitActive ("JrscCtrl","退出安装")
      send("!O")
WEnd
WinWaitActive("Autodesk DWF Viewer 5.0","下一步")
send("!N")
…………
…………
当程序运行完“WEnd”后,会弹出下图所示新窗口,此时就停住了,不再往下进行

lynfr8 发表于 2009-6-17 14:38:13

http://www.autoitx.com/forum.php?mod=viewthread&tid=7495&page=1&fromuid=1003#pid55745
WinActivate   :激活指定的窗口(设置焦点到该窗口,使其成为活动窗口)

addz1122 发表于 2009-6-17 15:27:00

谢谢lynfr8,不好意思,我刚刚发现问题的原因不是因为新弹出的窗口未激活,该窗口是激活的,而是
While WinWaitActive ("JrscCtrl","退出安装")
      send("!O")
WEnd
这个循环语句有问题,当不再出现("JrscCtrl","退出安装")界面后,进入到弹出界面状态,实际上程序里还在执行send("!O"),这我就不太明白了,不是当while后面为假时循环就结束了么?我现在弹出新窗口就应该为假了,为什么还要执行send("!O")呢?

lynfr8 发表于 2009-6-17 21:40:29

While WinWaitActive ("JrscCtrl","退出安装")
      send("!O")
WEnd加加上调试信息Opt("TrayIconDebug", 1)语句就明白你那个循环是停在WEnd那里,因为表达式的值为真则重复执行循环体语句(以WEnd为结束标志),否则循环结束
按照你的设计本来就应该结束循环进入下一句,可是再认真看下 WinWaitActive 的定义:暂停脚本的执行直至指定窗口被激活(成为可活动状态)为止
就这样脚本就停了,在苦苦等待那个他要的("JrscCtrl","退出安装")窗口归来
可是,伊人早已随人私奔一去不回头了
留下痴心郎独等....
把while语句删除吧,这里根本没必要用循环语句检测
直接步进就行了
WinWaitActive ("JrscCtrl","退出安装")
      send("!O")
WinWaitActive("Autodesk DWF Viewer 5.0","下一步")
send("!N")

hackone 发表于 2009-6-17 21:45:02

太帅了我很喜欢楼上的分析

addz1122 发表于 2009-6-18 14:17:40

非常感谢lynfr8 的细致回答,长了不少知识,先表示感谢!
因为我没说清楚,所以在这里再解释一下,就是我之所以加循环是因为("JrscCtrl","退出安装")界面会出来数次,但是因为机器不同出现的次数不一样,因此加上这个循环语句,如果去掉循环的话,第一次出现("JrscCtrl","退出安装")界面能过去,等第二次出现就卡死了。请lynfr8再帮忙分析一下吧,谢谢!

addz1122 发表于 2009-6-19 08:27:39

又分析了一下,循环那段代码的确不对,因为并不是所有机器都会弹出("JrscCtrl","退出安装")窗口,即使弹出的话次数也不确定,请高手们帮着分析分析像这种情况该如何写?

lynfr8 发表于 2009-6-19 14:04:25

你自己代码都会用AdlibEnable("myadlib")啦
这里也可以这样写
Func myadlib()
    If WinWaitActive ("JrscCtrl","退出安装") Then
      send("!O")
    EndIf
EndFunc

在开始加入
页: [1]
查看完整版本: 关于弹出新窗口后命令失效的问题