Способ закрыть дочерний файл HTA, если он снова вызывается из родительского файла HTA

Я хочу запустить файл HTA, где есть цикл, в котором родительский HTA вызывает дочерний HTA для регулярного отображения обновления. Я хочу, чтобы дочерний HTA оставался открытым со старым обновлением, и он должен закрываться при повторном вызове с новым обновлением и отображать его. Я пытался сделать это, но я не могу добавить условие близкого HTA для дочернего HTA. Что приводит к открытию всех дочерних HTA в фоновом режиме.

Родительский файл HTA,

Код приведен ниже

<html>
<head>
<title>Parent Application</title>
<HTA:APPLICATION
  APPLICATIONNAME="Parent Application"
  ID="ParentApplication"
  VERSION="1.0"/>
</head>

<script language="VBScript">

Sub OnClickButtonConnect()
  Dim currentDirectory,pos
  pos=InStrRev(document.location.pathname,"\")
  currentDirectory=""
  If pos>0 Then
    currentDirectory = Left(document.location.pathname,pos)
  End If

  Dim WshShell, i, g
  g = 5
  set WshShell = CreateObject("wscript.Shell")
  For i = 1 To g
  cmdline = "mshta.exe """ & currentDirectory & "child.hta"" """ & login.value & """ """ & password.Value & """"
  WshShell.Run cmdline,1,False
  next
  window.close
End Sub
</script>

<body bgcolor="white">

<!--Add your controls here-->

Login:<input type="text" name="login" id="login"><BR>
Password:<input type="password" name="password" id="password"><BR>
<input type="button" name="Connect" id="Connect" value="Connect" onclick="OnClickButtonConnect">
<!--{{InsertControlsHere}}-Do not remove this line-->
</body>
</html>

Детская HTA

<html>
<head>
<title>Child Application</title>
<HTA:APPLICATION
  APPLICATIONNAME="Child Application"
  ID="ChildApplication"
  VERSION="1.0"/>
</head>

<script language="VBScript">

Sub Window_OnLoad
  str=""
  arguments = Split(ChildApplication.CommandLine," """)
  For i=0 To UBound(arguments)
    arguments(i)=Replace(arguments(i),"""","")
  Next
  document.body.innerhtml="login is: " & arguments(1) & "<BR>password is: " &  arguments(2)
End Sub

</script>

<body bgcolor="white">

<!--Add your controls here-->

<!--{{InsertControlsHere}}-Do not remove this line-->
</body>
</html>

1 ответ

Решение

Назовите этот Sub, прежде чем открывать ребенка hta. Убедитесь, что имя hta совпадает с его реальным именем.

Sub CloseChild
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colProcessList = objWMIService.ExecQuery _
        ("Select CommandLine from Win32_Process where CommandLine like '%child.hta%'")
    For Each objProcess In colProcessList
        objProcess.Terminate()
    Next 
End Sub

Изменить: я просто хотел бы прокомментировать для тех, кто может прочитать это позже. Ввод CommandLine в операторе select явно не требуется, даже если это свойство используется в where пункт. Вы можете выбрать любое или все свойства в классе Win32_Process, включая или исключая CommandLine,

Я предлагаю выбрать только те свойства, которые необходимы для увеличения скорости запроса, и исторически, для ясности, я выбираю то же свойство, что и в where оговорка, если я на самом деле не нуждаюсь в этом.

Другие вопросы по тегам