在我创建的几个。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