【问题标题】:Unexpectedly Stopped Running after Closing an App Window关闭应用程序窗口后意外停止运行
【发布时间】:2020-01-21 13:17:16
【问题描述】:

我正在下面编写一个 vb 脚本来关闭标题为“错误”的 IE 弹出消息。

Set wshShell = CreateObject("WScript.Shell")
wshShell.AppActivate("Error") 
wshShell.SendKeys "{Enter}" 
MsgBox "Closed"

上面的代码可以通过发送回车键成功关闭弹出窗口。但是,永远不会执行下一行 MsgBox "Closed"。为什么会这样?我需要做什么才能让它发挥作用?

当我尝试发送 Tab 键而不是 Enter 时,MsgBox 会按预期显示。我怀疑当 Enter 键成功关闭错误窗口并因此阻止执行最后一行时发生了一些事情。

在 sendkey 和 msg 框之间插入延迟或任何代码行后,我能够让 msg 框出来。但是,我注意到在等待至少 20 秒后,我无法关闭消息框。我注意到这只发生在我尝试关闭 IE 错误窗口时。当我尝试使用其他本地 Windows 时,我可以关闭 MsgBox。为什么会这样?

【问题讨论】:

    标签: internet-explorer vbscript popupwindow


    【解决方案1】:

    这是因为 ENTER 键会立即关闭两个窗口。您应该在两个任务之间添加几秒钟的睡眠。

    Set wshShell = CreateObject("WScript.Shell") wshShell.AppActivate("Error") 
    Wscript.Sleep 4000
    wshShell.SendKeys "{ENTER}" 
    Wscript.Sleep 2000
    MsgBox "Closed"
    

    【讨论】:

    • 感谢 Wasif 的回复,但最后一行仍然没有被执行。我也尝试了同样的关闭记事本窗口。代码可以关闭它们,但仍然跳过最后一行。
    • 嗨瓦西夫。这样可行。但我注意到 Wscript.Sleep 2000 行可以是任何东西,而且它仍然有效,所以这里有些东西很有趣。例如,用 MsgBox "Test" 替换该行并执行代码,我得到最后一行,但 Test 消息框从未出现。你知道它为什么会这样吗?
    • 因为我们必须在每个消息框之前插入延迟。否则消息框会表现得很疯狂。请点击灰色勾号接受答案
    • 插入延迟似乎不是导致 msgbox 出现的原因,因为脚本似乎想跳过 SendKeys 方法行下方的行,所以我仍然怀疑如何它的行为方式是这样的。
    • 尝试逐行调试代码,看sendkeys回车后是否显示信息。尝试将 msgbox 替换为 debug.print 以查看它是否在控制台中打印 msg。
    【解决方案2】:

    找到了我自己问题的答案。所以看来 AppActivate 方法是罪魁祸首。由于服务器未能及时响应,它会长时间挂起脚本。

    因此,与其用 AppActivate 和 SendKeys 关闭窗口,不如用 Task Kill 代替它们是最好的解决方案:

    Set wshShell = CreateObject("WScript.Shell")
    wshShell.Run "cmd /c taskkill /fi ""WINDOWTITLE eq Error""", 0, True
    MsgBox "Closed"
    

    MsgBox 出现后,我可以单击“确定”立即关闭它。

    【讨论】:

    • 感谢您发布此问题的解决方案。我建议您在可以标记的 48 小时后尝试将自己的答案标记为该问题的已接受答案。它可以在未来帮助其他社区成员解决类似的问题。感谢您的理解。
    猜你喜欢
    • 2012-08-29
    • 2013-12-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多