我有一个HTML应用程序,用于构建自助服务终端环境。在每个会话结束时(当用户单击“注销”或超时后),我希望HTA自行关闭并重新启动*。我想知道如何使用VBScript以编程方式实现此目的。
这个过程应该是这样的
这是重新开放的部分,我遇到了麻烦。
我考虑过的一件事是;在关闭应用程序之前,设置一次只计划的任务以再次运行HTA。我不认为这是一个非常优雅的解决方案:(
感谢您的帮助!
干杯
伊恩
。*我希望HTA重新启动的原因是,在长时间使用后,奇怪的事情开始发生,我认为与mshta.exe或IE引擎中的错误有关。我的HTA非常依赖于动态创建的IFRAME,并且出于某种原因,HTA在关闭后不能正确清理它们。有点难以详细解释这个错误,但一个奇怪的例子是;我产生了一个新的IFRAME,当我询问DOM时,它看起来应该是应该的,但是浏览器呈现的是以前关注的IFRAME中的内容。
答案 0 :(得分:3)
当注销或超时时,HTA运行重启脚本,然后退出。重新启动脚本等待MSHTA进程消失,然后重新启动它并退出。
这可以通过使用WMI扫描正在运行的进程并查找MSHTA.EXE的实例来完成,该实例的命令行参数包含HTA的名称。
这是一个证明这一点的小例子。
这是一个准系统HTA,保存为RestartTest.hta:
<html> <!-- RestartTest.hta -->
<head>
<title>Self Restarting HTA Test</title>
<script language="VBScript">
sub RunApp(sApp)
CreateObject("WScript.Shell").Run(sApp)
end sub
sub LogOff()
RunApp "cscript.exe RestartHTA.vbs"
MsgBox "simulating delayed exit - click to close"
window.close()
end sub
</script>
</head>
<body >
<input type="button" value="Log off" onClick="LogOff()" />
</body>
</html>
这是重启脚本,另存为RestartHTA.vbs:
' RestartHTA.vbs'
' wait until RestartTest.hta is not running and restart it.'
MSHTA = "mshta.exe"
sHTA = "RestartTest.hta"
say "waiting for process " & MSHTA & " with param " & sHTA & " to end"
secs = 2000
bRunning = vbTrue
do while bRunning
if ProcessRunning(MSHTA, sHTA) then
say "still running, wait a few seconds"
WScript.Sleep secs
else
bRunning = vbFalse
end if
loop
say "HTA not found, proceding to restart"
WScript.Sleep secs
CreateObject("WScript.Shell").Run(sHTA)
WScript.Quit
'---'
function ProcessRunning(sProcess, sParam)
set oWMI = GetObject( _
"winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
set cProcs = oWMI.ExecQuery( _
"select * from Win32_Process where Name = '" & sProcess & "'")
bFound = vbFalse
for each oProc in cProcs
say oProc.Name & ": " & oProc.CommandLine
if (InStr(oProc.CommandLine, sParam) > 0) then
say "found"
bFound = vbTrue
else
say "wrong param"
end if
next
ProcessRunning = bFound
end function
sub Say(s)
WScript.Echo s
end sub
'==='
你可以运行任何一个开始循环,然后用它的X按钮关闭HTA来打破它。请注意,我明确地使用CScript运行重启脚本。这只是为了显示它的控制台输出用于演示目的(并且因为我出于某种原因设置并将CScript保留为我的机器上的默认设置)。
答案 1 :(得分:1)
看看下面的代码:
<html>
<title>HTA Restart</title>
<head>
<HTA:APPLICATION
Id="oHTA"
Border="thick"
InnerBorder="no"
Scroll="no"/>
</head>
<script language="vbscript">
Sub Restart()
CreateObject("WScript.Shell").Run "mshta " & oHTA.commandLine
window.close
End Sub
</script>
<body style="background-color: buttonface;">
<input type="button" value="Logout" onclick="Restart()" />
</body>
</html>