HTA脚本的睡眠程序



在我创建的几个。hta脚本中,我需要VBScript WScript。Sleep命令,它只是等待一些毫秒而不使用CPU。当我浏览网页时,似乎我不是唯一一个寻找这个的人:

https://www.google.nl/search?q=hta +睡眠

(我敢打赌,如果你读到这篇文章,你可能也需要它)

我能找到的最好的解决方案似乎是使用PING命令。但是,特别是对于只需要暂停脚本几个100ms的情况,这种解决方案非常奇怪,因为它使用外部命令并触发各种(网络)进程,这些进程不太可能与有关的。hta脚本有任何关系。

所以我想到的第一件事是使用WMI Win32_PingStatus类来避免外部命令,但后来我开始质疑为什么不完全基于WMI。我花了几个小时才把正确的WMI类和方法准备好,但最后我成功了……

在编写HTA时,您应该异步思考。考虑重写代码以使用window.setTimeout。在下面的示例中,我将使用window.setTimeout每2秒发出一次铃声:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="x-ua-compatible" content="ie=8">
<title>Bell Test</title>
<script language="VBScript">
Option Explicit
Dim objWShell
Set objWShell = CreateObject("WScript.Shell")
Sub DoPing
    divText.innerText = Now
    objWShell.Run "%COMSPEC% /c ECHO " & Chr(7), 0, False
    window.setTimeOut "DoPing", 2000
End Sub
Sub window_OnLoad
   window.ResizeTo 240,130
   DoPing
End Sub
</script>
</head>
<body>
<div id="divText">TEST</div>
</body>
</html>

我在HTA上遇到了同样的问题。我的解决方案与vbs…

Sub sleep (Timesec)
    Set objwsh = CreateObject("WScript.Shell") 
    objwsh.Run "Timeout /T " & Timesec & " /nobreak" ,0 ,true
    Set objwsh = Nothing
End Sub
' example wait for 3 seconds
sleep 3

这个例程将调用一个shell命令,最小化并且没有键盘命令。

Sub Sleep(iMilliSeconds)
    With GetObject("winmgmts:\.rootcimv2")
        With .Get("__IntervalTimerInstruction").SpawnInstance_()
            .TimerId = "Sleep"
            .IntervalBetweenEvents = iMilliSeconds
            .Put_()
        End With
        .ExecNotificationQuery("SELECT * FROM __TimerEvent WHERE TimerId='Sleep'").NextEvent
    End With
End Sub

添加2015-02-11:

不幸的是,此功能在使用Internet Explorer 10时不起作用(请参阅下面的注释)。在Internet Explorer 11安装后,如果您以管理员身份运行HTA,它似乎可以工作。

等待(2000)'暂停2秒

Sub Wait(Time)
  Dim wmiQuery, objWMIService, objPing, objStatus
  wmiQuery = "Select * From Win32_PingStatus Where Address = '1.1.1.1' AND Timeout = " & Time
  Set objWMIService = GetObject("winmgmts:\.rootcimv2")
  Set objPing = objWMIService.ExecQuery(wmiQuery)
  For Each objStatus in objPing
  Next
End Sub
Sub Sleep (ms) 
  Set fso = CreateObject("Scripting.FileSystemObject") 
  Dim sFilePath: sFilePath = fso.GetSpecialFolder(2) & "WScriptSleeper.vbs"
  If Not fso.FileExists(sFilePath) Then
      Set oFile = fso.CreateTextFile(sFilePath, True)
      oFile.Write "wscript.sleep WScript.Arguments(0)"
      oFile.Close
  End If
  Dim oShell: Set oShell = CreateObject("WScript.Shell")
  oShell.Run sFilePath & " " & ms, 1, True
End Sub

相关内容

  • 没有找到相关文章

最新更新