3

キオスク環境を構築するために使用している HTML アプリケーションがあります。すべてのセッションの終わり (ユーザーが [ログアウト] をクリックしたとき、またはタイムアウトの後) に、HTA を閉じて再起動するようにします*。VBScript を使用してプログラムでこれを実現する方法を考えていました。

プロセスは次のようになります

  • ユーザーが「ログアウト」をクリックするか、5 分間入力がない場合
  • インターネット一時ファイルを削除する
  • HTA を閉じる
  • HTA を再度開く

私が悩んでいる再開の部分です。

私が考慮したことの1つは、次のとおりです。アプリケーションを閉じる前に、一度だけスケジュールされたタスクを設定して、HTA を再度実行します。ただし、これは非常にエレガントなソリューションではないと思います:(

助けてくれてありがとう!

乾杯

イアン


.* HTA を自動的に再起動したい理由は、長時間使用すると、mshta.exe または IE エンジンのバグに関連すると思われる奇妙なことが起こり始めるからです。私の HTA は、動的に作成された IFRAME に大きく依存しています。何らかの理由で、HTA は IFRAME を閉じると適切にクリーンアップしません。バグを詳細に説明するのはちょっと難しいですが、奇妙さの例は次のとおりです。新しい IFRAME を生成し、DOM に問い合わせると、すべてが本来あるべきように見えますが、ブラウザーがレンダリングするのは、以前にフォーカスされた IFRAME にあったものです。

4

2 に答える 2

3

ログオフまたはタイムアウトすると、HTA は再起動スクリプトを実行してから終了します。再起動スクリプトは、MSHTA プロセスがなくなるのを待ってから、再起動して終了します。

これを行うには、WMI を使用して実行中のプロセスをスキャンし、コマンド ライン パラメータに HTA の名前が含まれている MSHTA.EXE のインスタンスを探します。

これを示す小さな例を次に示します。

これはベアボーン 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 をマシンのデフォルトとして設定および維持するのに問題があるため)。

于 2010-09-18T15:09:08.317 に答える
2

以下のコードを見てください。

<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>
于 2016-09-29T17:01:39.143 に答える