能否将HTA代码嵌入VBScript,替代停用IE实现信息采集展示弹窗
编辑补充
我司此前使用VBScript和IE创建弹窗,用于信息收集与展示。目前IE已停止服务,该方案无法在Edge中运行。我们希望找到将HTA嵌入VBScript的方法,和此前使用IE的方式一致。以下是我们当前在用的代码:
Function Create_Display(File_Path) Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate "about:blank" Win_Title = "GROUP TYPE " & MyArray(3) & " FOUND" objIE.Document.body.innerHTML = "<title>" & Win_Title & "</title><p class='msg'>Group Type " & MyArray(3) & " Returned for TIN: <span>" & _ TIN & "</span></p><table border=0><tr><th>Seq#</th><th>Group Name</th><th>Group NPI</th><th>MPIN</th><th>Group Type</th><th>Group Start Date</th><th>Group Term Date</th><th>Network Start Date</th><th>Network Term Date</th><th>Network ID</th></tr><tr><td>" & List & _ "<p class='ctrl'><input type='hidden' id='Submit' name='Submit' value='0'><input type='submit' value='OK' id='SubmitButton' onclick='document.all.Submit.value=1' autofocus></p>" Set Style = objIE.Document.CreateStyleSheet Style.AddRule "p.msg", "font-family:calibri;font-weight:bold;text-decoration:underline;color:black;" Style.AddRule "p.not", "font-family:calibri;color:black;" Style.AddRule "p.ctrl", "text-align:center;" objIE.Visible = True objIE.Document.all.Submit.Focus Do Until FormExit = "GO" If objIE.Document.all.Submit.Value = 1 Then objIE.Quit Exit Function End If Loop End Function
上述代码可生成如下图所示的弹窗:
由于我们后续无法再使用objIE与IE交互,希望找到同类嵌入HTA的实现方式。若无法嵌入HTA,是否可以通过WSH实现类似效果?
示例参考:
set objShell = CreateObject("shell.application") objShell.Navigate "about:blank"
解决方案
推荐优先使用HTA方案,完全可以复刻原有IE弹窗的所有功能,且不依赖Edge或IE浏览器,是Windows系统原生支持的方案,业务逻辑改动量最小。
具体实现逻辑
你可以在原有VBScript中动态生成临时HTA文件,调用系统自带的mshta.exe运行该文件,等待用户操作后读取返回值再删除临时文件即可,具体实现代码如下:
Function Create_Display_HTA(File_Path) ' 生成临时HTA文件路径 Set fso = CreateObject("Scripting.FileSystemObject") tempPath = fso.GetSpecialFolder(2) & "\" & fso.GetTempName() & ".hta" ' 拼接HTA内容,完全复用原有HTML和样式 htaContent = "<html>" & vbCrLf &_ "<head>" & vbCrLf &_ "<title>GROUP TYPE " & MyArray(3) & " FOUND</title>" & vbCrLf &_ "<hta:application id='oHTA' border='thick' borderstyle='raised' caption='yes' contextmenu='no' maximizebutton='no' minimizebutton='no' navigable='no' scroll='no' showintaskbar='yes' singleinstance='yes' sysmenu='yes' windowstate='normal' />" & vbCrLf &_ "<style>" & vbCrLf &_ "p.msg {font-family:calibri;font-weight:bold;text-decoration:underline;color:black;}" & vbCrLf &_ "p.not {font-family:calibri;color:black;}" & vbCrLf &_ "p.ctrl {text-align:center;}" & vbCrLf &_ "</style>" & vbCrLf &_ "</head>" & vbCrLf &_ "<body>" & vbCrLf &_ "<p class='msg'>Group Type " & MyArray(3) & " Returned for TIN: <span>" & TIN & "</span></p>" & vbCrLf &_ "<table border=0>" & vbCrLf &_ "<tr><th>Seq#</th><th>Group Name</th><th>Group NPI</th><th>MPIN</th><th>Group Type</th><th>Group Start Date</th><th>Group Term Date</th><th>Network Start Date</th><th>Network Term Date</th><th>Network ID</th></tr>" & vbCrLf &_ "<tr><td>" & List & "</td></tr>" & vbCrLf &_ "</table>" & vbCrLf &_ "<p class='ctrl'><input type='submit' value='OK' id='SubmitButton' onclick='window.close()' autofocus></p>" & vbCrLf &_ "</body>" & vbCrLf &_ "</html>" ' 写入临时HTA文件 Set ts = fso.CreateTextFile(tempPath, True) ts.Write htaContent ts.Close ' 运行HTA并等待用户关闭 Set wshShell = CreateObject("WScript.Shell") wshShell.Run "mshta.exe """ & tempPath & """", 1, True ' 删除临时文件 fso.DeleteFile tempPath, True End Function
方案说明
- 上述代码完全复用了你原有逻辑中的HTML结构、样式和展示内容,不需要调整业务逻辑
- HTA由Windows系统自带的mshta.exe执行,不依赖任何浏览器,不受IE停服影响
- 如果你需要获取HTA中的用户输入数据,可以在HTA关闭前将数据写入临时文件,主VBScript在HTA关闭后读取该文件即可
WSH替代方案
如果不想使用HTA,纯WSH无法实现复杂的HTML表格展示,仅能实现简单的弹窗交互,只适合不需要复杂排版的场景:
' 仅能展示简单文本,无法展示表格 Set wshShell = CreateObject("WScript.Shell") returnValue = wshShell.Popup("Group Type " & MyArray(3) & " Returned for TIN: " & TIN, 0, "GROUP TYPE " & MyArray(3) & " FOUND", 0)
内容的提问来源于stack exchange,提问作者Lou
相关产品推荐
相关产品推荐

