通过 HTA 中的 VBS 恢复最小化的应用程序

Restore a minimised application via VBS within an HTA

我有一个 HTA,它在执行备份时被最小化了。备份完成后,我想恢复 HTA,但我遇到了麻烦。

我尝试了一些方法(如下),但没有成功。有谁能指出我最终的解决方案吗?

首先我尝试简单地激活 HTA,但失败了。我不是专家,但我的理解是这样做应该模仿鼠标单击任务栏中的 HTA,从而恢复它 -

Sub RestoreBackupHTA()

    Shell.AppActivate "Backup"

End Sub

接下来我尝试激活 HTA,然后将密钥发送给 "restore" 激活的 window,但同样失败了 -

Sub RestoreBackupHTA()

    Shell.AppActivate "Backup"
    Shell.SendKeys "% r"

End Sub

最后,我尝试先激活 HTA,然后在短暂的超时后将密钥发送到 "restore" 活动的 window(我发现一些帖子表明这可以帮助确保HTA 在发送密钥以恢复它之前完全处于活动状态),但再次失败 -

Sub RestoreBackupHTA()

    Shell.AppActivate "Backup"
    Call window.setTimeout("RestoreBackupHTAAfterWait", 500, "VBScript")

End Sub

Sub RestoreBackupHTAAfterWait()

    '** Create a tempory Shell object (required as the global Shell object is out of scope for some reason *'
    Dim tmpShell
    Set tmpShell = CreateObject("Wscript.Shell")

    tmpShell.SendKeys "% r" ' Restore the HTA

    Set tmpShell = Nothing  ' Destroy the tmpShell object

End Sub

备注-

  1. HTA 的 ID "Backup"(<HTA:APPLICATION ID="Backup" ... />, and so "Backup" is displayed in the title bar when it is running (and as the title in the task manager). This is why I'm using it as thetitleparameter forShell.AppActivate`,根据 this MSDN page 这应该是正确的。
  2. Shell 是全局声明和设置的,因此它可用于上面示例中的 RestoreBackupHTA 过程。

嗯。它似乎对我有用。我的 window 标题显示了 hta 的完整路径,所以我尝试了以下操作(在使用 setTimeout 之后):

With CreateObject("WScript.Shell")
    .AppActivate("test.hta")
    .SendKeys "% r"
End With

没有任何问题。

但这是另一种方式。您可以使用 nircmd(手头总是很方便)。

CreateObject("WScript.Shell").Run "nircmd.exe win normal ititle Backup"

这将恢复标题中带有 "Backup" 的任何 windows。如果您需要更精细的控制,您可以通过多种方式(标题、class、PID 等)进行过滤。

因为您使用的是 HTA,所以可以使用 SINGLEINSTANCE 参数

<HTA:APPLICATION ID="RestoreMe" SINGLEINSTANCE="yes">

这样当您重新启动 HTA 应用程序时,它会欺骗 windows 来恢复现有的 HTA 应用程序:

Set objShell = CreateObject("WScript.Shell")
objShell.run location.href

为了说明这一点,我创建了一个模拟 HTA 应用程序,您必须在启动它的前 5 秒内将其最小化。 5 秒后,它将自行恢复:

<!DOCTYPE html>
<HEAD>
<TITLE>Restore Me</TITLE>
<HTA:APPLICATION ID="RestoreMe" SINGLEINSTANCE="yes">
<SCRIPT language="VBScript">
Sub RestoreMe
    Set objShell = CreateObject("WScript.Shell")
    objShell.run location.href
End Sub
Call window.setTimeout("RestoreMe", 5000)
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>