将GUI添加到VBScript

时间:2013-04-17 05:50:55

标签: user-interface vbscript

我目前正在研究vbs脚本,但我需要用户与脚本进行交互。基本上我需要两个按钮和4个复选框(复选框并不重要)。

提前致谢

3 个答案:

答案 0 :(得分:5)

VBScript有对话框,只有很多而且没有复选框,你需要一个COM对象才能这样做(而且有)。我确定你知道Messagebox,这里是一个鲜为人知的Popup的例子

Dim WshShell, BtnCode
Set WshShell = WScript.CreateObject("WScript.Shell")

BtnCode = WshShell.Popup("Do you feel alright?", 7, "Answer This Question:", 4 + 32)

Select Case BtnCode
   case 6      WScript.Echo "Glad to hear you feel alright."
   case 7      WScript.Echo "Hope you're feeling better soon."
   case -1     WScript.Echo "Is there anybody out there?"
End Select

但是,在vbscript中使用更多对话框的最佳方法是使用HTA。 这是一个例子

<HTML><HEAD>
   <HTA:APPLICATION
   ID = "oApp"
   APPLICATIONNAME = "Example"
   BORDER = "thick"
   CAPTION = "yes"
   ICON = "app.ico"
   SHOWINTASKBAR = "yes"
   SINGLEINSTANCE = "yes"
   SYSMENU = "yes"
   WINDOWSTATE = "normal"
   SCROLL = "yes"
   SCROLLFLAT = "yes"
   VERSION = "1.0"
   INNERBORDER = "yes"
   SELECTION = "no"
   MAXIMIZEBUTTON = "yes"
   MINIMIZEBUTTON = "yes"
   NAVIGABLE = "yes"
   CONTEXTMENU = "yes"
   BORDERSTYLE = "normal"
   >

   <SCRIPT language="vbscript">
   sub SimpleExeample()
     document.body.innerHTML = "<form name=myform><input type=checkbox name=chk1>Check me<br><br><button onclick='alert(myform.chk1.checked)'>Show if checked</button></form>"
   end sub
   </SCRIPT>

</HEAD>
<BODY onLoad="SimpleExeample()">
</BODY>
</HTML>

有一件事我同意Cody,如果你开始编程选择另一种语言,vbscript几乎已经死了。看看Ruby,开始很容易学习它很有趣。 这里有一个使用鞋子作为GUI的u ruby​​脚本的例子

require 'green_shoes'
Shoes.app{
  button("Click me!"){alert("You clicked me.")}
}
编辑:因为我的Ruby替代方案提出了一些问题,所以这里更接近Vbscript使用相同样本的传统​​方式。上面的示例更多地用于功能链式编程方式。

require 'green_shoes'
Shoes.app do
  button("Click me!") do
    alert("You clicked me.")
  end
end

答案 1 :(得分:0)

我发现最好的方法是使用“ WScript.Shell Run”从VBS打开HTA文件,并使用XML文件与VBS通信。

示例(dialog.vbs)

Set fso = CreateObject("Scripting.FileSystemObject") 
Set oFile = fso.GetFile(Wscript.ScriptFullName) 
sFolder = oFile.ParentFolder 
sHtaFilePath = sFolder & "\dialog.hta"
Dim oShell: Set oShell = CreateObject("WScript.Shell")
oShell.Run sHtaFilePath, 1, True

'Load return data from XML File
If fso.FileExists(sHtaFilePath & ".xml") Then
    Set oXml = CreateObject("Microsoft.XMLDOM")
    oXML.async = False
    oXML.load sHtaFilePath & ".xml"

    MsgBox "Value 1: " & oXML.SelectSingleNode("/root/txt1").text
    MsgBox "Value 2: " & oXML.SelectSingleNode("/root/txt2").text

    fso.DeleteFile sHtaFilePath & ".xml"
End If

示例HTA(dialog.hta)

<html>
  <title>Test</title>
  <head>
  <HTA:APPLICATION 
  ID=oHTA 
  SINGLEINSTANCE="yes"
  SCROLL="no"
  />
</head>

<script language="vbscript">
  Window.ResizeTo 300, 200
  Set fso = CreateObject("Scripting.FileSystemObject") 

  Sub Send()
    Dim sFilePath: sFilePath = Replace(location.href,"file:///","")
    sFilePath = Replace(sFilePath,"/","\")
    sFilePath = Replace(sFilePath," %20"," ")

    'Save return date to XML File
    Set oXml = CreateObject("Microsoft.XMLDOM")
    Set oRoot = oXml.createElement("root")
    oXml.appendChild oRoot
    AddXmlVal oXml, oRoot, "txt1", txt1.value
    AddXmlVal oXml, oRoot, "txt2", txt2.value
    oXml.Save sFilePath & ".xml"

    self.Close()
  End Sub

  Sub AddXmlVal(oXml, oRoot, sName, sVal)
    Set oNode = oXml.createElement(sName)
    oNode.Text = sVal
    oRoot.appendChild oNode
  End Sub

</script>

<body>
  <div>
    Value 1 
    <input id="txt1" style="width: 100px;">
  </div>

  <div>
    Value 2 
    <select id=txt2 style="width: 100px;">
      <option value="A">A</option>
      <option value="B">B</option>
      <option value="C">D</option>
    </select>
  </div>

<p align=center>
  <input type="button" value="Send" onclick="Send()">
  <input type="button" value="close" onclick="self.Close()">
</p>

</body>
</html>

更好的方法是由VBS文件创建HTA文件,然后将其删除。这样,HTA不必与VBS一起分发。

Set fso = CreateObject("Scripting.FileSystemObject") 

sHtml = "<div>Value 1 " & _
    "<input id='txt1' style='width: 100px'>" & _
  "</div>" & _
  "<div>Value 2 " & _
    "<select id='txt2' style='width: 100px'>" & _
      "<option value='A'>A</option>" & _
      "<option value='B'>B</option>" & _
      "<option value='C'>D</option>" & _
    "</select>" & _
  "</div>" & _
  "<p align=center>" & _
    "<input type='button' value='Send' onclick='Send()'> " & _
    "<input type='button' value='Close' onclick='self.Close()'>" & _
  "</p>"

  Set oRet = OpenDialog(sHtml, "txt1,txt2", 300, 200, "Dialog 1")
  MsgBox "Value 1: " & oRet("txt1") & ", Value 2: " & oRet("txt2")

'==================================
Function OpenDialog(sHtml, sFields,iWidth,iHeight, sTitle)
  sHtaFilePath = Wscript.ScriptFullName & ".hta"

  CreateHtaFile sHtaFilePath, sHtml, sFields,iWidth,iHeight,sTitle

  Set f = fso.GetFile(sHtaFilePath)
  f.attributes = f.attributes + 2 'Hidden

  Dim oShell: Set oShell = CreateObject("WScript.Shell")

  oShell.Run """" & sHtaFilePath & """", 1, True

  If fso.FileExists(sHtaFilePath) Then
    fso.DeleteFile sHtaFilePath
  End If

  Set oRet = CreateObject("Scripting.Dictionary")

  'Load return data from XML File
  If fso.FileExists(sHtaFilePath & ".xml") Then
      Set oXml = CreateObject("Microsoft.XMLDOM")
      oXML.async = False
      oXML.load sHtaFilePath & ".xml"

      For each sField In Split(sFields,",")
        oRet.Add trim(sField), oXML.SelectSingleNode("/root/" & trim(sField)).text
      Next

      fso.DeleteFile sHtaFilePath & ".xml"
  End If

  Set OpenDialog = oRet
End Function

Sub CreateHtaFile(sHtaFilePath, sHtml, sFields, iWidth, iHeight, sTitle)
  Set f = fso.CreateTextFile(sHtaFilePath, True)
  f.WriteLine "<html><title>FL Reporting</title><head><HTA:APPLICATION ID=oHTA SINGLEINSTANCE=""yes"" SCROLL=""no""/></head>"
  f.WriteLine "<script language=""vbscript"">"
  f.WriteLine "Window.ResizeTo " & iWidth & ", " & iHeight
  f.WriteLine "Set fso = CreateObject(""Scripting.FileSystemObject"")"
  f.WriteLine ""
  f.WriteLine "Sub Send()"
  f.WriteLine " Dim sFilePath: sFilePath = Replace(location.href,""file:///"","""")"
  f.WriteLine " sFilePath = Replace(sFilePath,""/"",""\"")"
  f.WriteLine " sFilePath = Replace(sFilePath,""%20"","" "")"
  f.WriteLine " Set oXml = CreateObject(""Microsoft.XMLDOM"")"
  f.WriteLine " Set oRoot = oXml.createElement(""root"")"
  f.WriteLine " oXml.appendChild oRoot"

  For each sField In Split(sFields,",")
    f.WriteLine " AddXmlVal oXml, oRoot, """ & sField & """, GetVal(" & sField & ")"
  Next

  f.WriteLine " oXml.Save sFilePath & "".xml"""
  f.WriteLine " self.Close()"
  f.WriteLine "End Sub"
  f.WriteLine ""
  f.WriteLine "Sub AddXmlVal(oXml, oRoot, sName, sVal)"
  f.WriteLine " Set oNode = oXml.createElement(sName)"
  f.WriteLine " oNode.Text = sVal"
  f.WriteLine " oRoot.appendChild oNode"
  f.WriteLine "End Sub"
  f.WriteLine ""
  f.WriteLine "Function GetVal(o)"
  f.WriteLine " GetVal = o.value"
  f.WriteLine " If o.Type = ""checkbox"" Then"
  f.WriteLine "   If o.checked = False Then"
  f.WriteLine "     GetVal = """""
  f.WriteLine "   End If"
  f.WriteLine " End If"
  f.WriteLine "End Function"  
  f.WriteLine "</script>"
  f.WriteLine "<body>"
  f.WriteLine sHtml
  f.WriteLine "</body></html>"
  f.Close
End Sub

答案 2 :(得分:-1)

今天,我想介绍两个您感兴趣的项目。

  • wsh-js-gtk-使用GTK-server
  • 从JScript / VBScript制作自己的GUI
  • welsonjs-使用具有ES6 / HTML5兼容性的polyfill,module.exports(NodeJS)样式的模块实现,基于WSH / HTA构建Windows桌面应用程序。