通过 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
备注-
- 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 the
titleparameter for
Shell.AppActivate`,根据 this MSDN page 这应该是正确的。
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>
我有一个 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
备注-
- 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 the
titleparameter for
Shell.AppActivate`,根据 this MSDN page 这应该是正确的。 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>