VBS实现“多线程”

标签: , , , , ,

今天有人发邮件问我一个问题:

想请教一下VBS中INPUTBOX函数能否超时关闭?
如果可以的话,应该如何超时关闭输入框? 万分感谢

乍一看这是不可能实现的,因为InputBox函数本身没有超时关闭的参数,而且程序会一直等待InputBox返回才继续运行,后面的语句不可能在InputBox返回之前执行。

如果VBS能实现高级语言的多线程的话……只可惜VBS不可能实现多线程,但是可以用setTimeout方法模拟“多线程”。

Dim IE
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate "about:blank"
Set window = IE.Document.parentWindow
id = window.setTimeout(GetRef("on_timeout"),3000,"VBScript")
name = InputBox("Please enter your name","InputBox Timeout")
window.clearTimeout id
If name <> "" Then MsgBox "Hello," & name
IE.Quit

'By Demon
'http://demon.tw

Sub on_timeout()
    Dim WshShell
    set WshShell = CreateObject("wscript.Shell")
    WshShell.SendKeys "{ESC}"
End Sub

用setTimeout方法设定3秒超时,3秒后用SendKeys方法发送ESC键结束InputBox。当然,用SendKeys是很不靠谱的,我一般很少用SendKeys方法,因为它做了太多的假设,万一InputBox不是激活窗口呢?这里只是为了程序简单而用了SendKeys,可以换成结束脚本本身。

同理,想在VBS中实现VB中的Timer事件的话可以用setInterval方法,我就不写例子了,自己看文档。

参考链接:setTimeout Method (window, Window Constructor)

 

随机文章:

  1. 用VBS生成GUID
  2. 迅雷中的VBS脚本
  3. Windows下编译cURL
  4. 用VBS发送邮件
  5. Windows下用TCC编译PCRE源码

5 条评论 发表在“VBS实现“多线程””上

  1. 乱码说道:

    第二次来看这个篇文章了,思路很不错,再次膜拜。
    万恶的360浏览器老是会弹窗,如果默认是IE浏览器的话到是可以隐藏,
    但是现在很多人默认的不是IE浏览器了,所以稍微变通下思路,htmlfile实现

    Set html = CreateObject(“htmlfile”)
    Set window = html.parentWindow
    id = window.setTimeout(GetRef(“on_timeout”),3000,”VBScript”)
    name = InputBox(“Please enter your name”,”InputBox Timeout”)
    window.clearTimeout id
    If name “” Then MsgBox “Hello,” & name

    Sub on_timeout()
    Dim WshShell
    Set WshShell = CreateObject(“wscript.Shell”)
    WshShell.SendKeys “{ESC}”
    End Sub

    以前技术不够,现在在你这学的多了,也来帖代码了,呵呵。
    当然我是看你的文章偷学来到,不算是入门弟子。

    • yu2n说道:

      被WP吃掉了很多代码,补上……


      Option Explicit

      Dim oHtml, oWindow, nId, sName
      Set oHtml = CreateObject("htmlfile")
      Set oWindow = oHtml.parentWindow
      nId = oWindow.setTimeout(GetRef("on_timeout"), 3000, "VBScript")
      sName = InputBox("Please enter your name", "InputBox Timeout")
      oWindow.clearTimeout nId
      If sName<>"" Then MsgBox "Hello," & sName

      Sub on_timeout()
        CreateObject("WScript.Shell").SendKeys "{ESC}"
      End Sub

  2. nils说道:

    GetRef..学习中

  3. 枫中残雪说道:

    真是好方法,这都想到了,

  4. […] 我曾经也写过一篇《VBS实现“多线程”》(注意我的“多线程”加了双引号): […]

留下回复