Как заставить HTA перезапустить себя? - PullRequest
2 голосов
/ 30 августа 2010

У меня есть приложение HTML, которое я использую для создания среды киоска. В конце каждого сеанса (когда пользователь нажимает «Выйти» или по истечении времени ожидания), я хочу, чтобы HTA закрылся и перезапустился *. Мне было интересно, как я смогу добиться этого программно с помощью VBScript.

Процесс должен идти примерно так

  • Пользователь нажимает кнопку «Выйти» или, если не было ввода в течение 5 минут
  • Удалить временные интернет-файлы
  • Закрыть HTA
  • Открыть HTA

У меня проблемы с открытием.

Одна вещь, которую я учел, это; перед закрытием приложения установите однократную запланированную задачу для повторного запуска HTA. Я не думаю, что это очень элегантное решение: (

Спасибо за вашу помощь, ребята!

Приветствия

Иэн


. * Причина, по которой я хочу перезапустить HTA, заключается в том, что после расширенного использования начинают происходить странные вещи, которые, я думаю, связаны с ошибками в mshta.exe или в движке IE. Мой HTA довольно сильно зависит от динамически создаваемых IFRAME, и по какой-то причине HTA не очищает их должным образом после их закрытия. Трудно объяснить ошибку подробно, но пример странности таков; Я создаю новый IFRAME, и когда я опрашиваю DOM, все выглядит так, как должно, но браузер отображает то, что было в ранее сфокусированном IFRAME.

Ответы [ 2 ]

3 голосов
/ 18 сентября 2010

При выходе из системы или времени ожидания HTA ​​запускает скрипт перезапуска, а затем завершает работу.Сценарий перезапуска ожидает завершения процесса MSHTA, затем перезапускает его и завершает работу.

Это можно сделать с помощью WMI для сканирования запущенных процессов и поиска экземпляра MSHTA.EXE, параметр командной строки которого содержит имя HTA.

Вот небольшой пример, демонстрирующийthis.

Это базовый 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

'==='

Вы можете запустить любой из них, чтобы начать цикл, а затем просто закрыть HTA кнопкой X, чтобы прервать его.Обратите внимание, что я запускаю скрипт перезапуска с CScript явно.Это просто для демонстрации вывода на консоль в демонстрационных целях (и из-за проблем с настройкой и сохранением CScript по умолчанию на моем компьютере по какой-то причине).

1 голос
/ 29 сентября 2016

Посмотрите на следующий код:

<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>
...