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

时间:2015-06-12 10:37:21

标签: vbscript restore hta minimize

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

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

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

Sub RestoreBackupHTA()

    Shell.AppActivate "Backup"

End Sub

接下来我尝试激活HTA然后发送密钥以“恢复”活动窗口,但这也失败了 -

Sub RestoreBackupHTA()

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

End Sub

最后我尝试先激活HTA,然后在短暂超时后发送密钥“恢复”活动窗口(我发现有几个帖子暗示这有助于确保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为“备份”(<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 the标题parameter for Shell.AppActivate`,根据this MSDN page应该是正确的。
  2. Shell是全局声明和设置的,因此上面示例中的RestoreBackupHTA过程可以使用它。

2 个答案:

答案 0 :(得分:2)

嗯。它似乎对我有用。我的窗口标题显示了hta的完整路径,所以我只是尝试了以下(使用setTimeout后):

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

并没有任何问题。

但这是另一种方式。您可以使用nircmd(随时可以随时使用)。

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

这将使用&#34; Backup&#34;恢复任何窗口。在标题中。如果需要更好的控制,可以过滤多种方式(标题,类,PID等)。

答案 1 :(得分:0)

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

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

这样当您重新启动HTA应用程序时,它将欺骗窗口以恢复现有的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>