VB 脚本 - 帮助使用 HTA 表单将变量设置为用户输入的值

Posted

技术标签:

【中文标题】VB 脚本 - 帮助使用 HTA 表单将变量设置为用户输入的值【英文标题】:VB Script - Help in setting variable to value of user input with HTA form 【发布时间】:2021-09-10 02:50:39 【问题描述】:

示例脚本最初由 OMEGASTRIPES 在此处发布:https://pastebin.com/wZYTtT8V

并在 Stack Overflow 上通过以下链接进一步讨论:Pass two lines of text into InputBox

该脚本基本上完全符合我的需要(或至少是它的第一部分),即捕获一长串文本(包括换行符),然后我需要对其进行按摩,以便重新使用部分字符串。该脚本现在正在执行我需要的所有操作,但有一个例外。示例脚本在最后的窗口中显示用户的输入。我不想显示窗口,而只想将用户输入的值分配给一个变量。不是开发人员(只是在必要时偶尔试一下)我已经努力了几个小时来尝试实现这一目标,包括尝试使用 GetElementbyName 失败的尝试。 有人可以让我摆脱痛苦,因为我确信这将变得非常简单,但我只是不知道如何,我的研究是空白。示例脚本中的违规行位于 case 语句的第三个区域:

inputboxml = window.hta_textarea.value
window.close

以下只是我尝试(但失败)将输入值分配给变量的许多不同方法的一个示例:

inputboxml = document.getElementsByName("hta_textarea")

任何人可以提供给我的任何帮助都将得到非常感激。下面是整个示例脚本。

谢谢,史蒂夫

'Example Script

dim completed
 
msgbox inputboxml("Enter text:", "Multiline inputbox via HTA", "default" & vbcrlf & vbtab & "multiline" & vbcrlf & "text")
 
function inputboxml(prompt, title, defval)
    set window = createwindow()
    completed = 0
    defval = replace(replace(replace(defval, "&", "&amp;"), "<", "&lt;"), ">", "&gt;")
    with window
        with .document
            .title = title
            .body.style.background = "buttonface"
            .body.style.fontfamily = "consolas, courier new"
            .body.style.fontsize = "8pt"
            .body.innerhtml = "<div><center><nobr>" & prompt & "</nobr><br><br></center><textarea id='hta_textarea' style='font-family: consolas, courier new; width: 100%; height: 580px;'>" & defval & "</textarea><br><button id='hta_cancel' style='font-family: consolas, courier new; width: 85px; margin: 10px; padding: 3px; float: right;'>Cancel</button><button id='hta_ok' style='font-family: consolas, courier new; width: 85px; margin: 10px; padding: 3px; float: right;'>OK</button></div>"
        end with
        .resizeto 700, 700
        .moveto 100, 100
    end with
    window.hta_textarea.focus
    set window.hta_cancel.onclick = getref("hta_cancel")
    set window.hta_ok.onclick = getref("hta_ok")
    set window.document.body.onunload = getref("hta_onunload")
    do until completed > 0
        wscript.sleep 10
    loop
    select case completed
    case 1
        inputboxml = ""
    case 2
        inputboxml = ""
        window.close
    case 3
        inputboxml = window.hta_textarea.value
        window.close
    end select
end function
 
function createwindow()
    rem source http://forum.script-coding.com/viewtopic.php?pid=75356#p75356
    dim signature, shellwnd, proc
    on error resume next
    signature = left(createobject("Scriptlet.TypeLib").guid, 38)
    do
        set proc = createobject("WScript.Shell").exec("mshta ""about:<head><script>moveTo(-32000,-32000);</script><hta:application id=app border=dialog minimizebutton=no maximizebutton=no scroll=no showintaskbar=yes contextmenu=no selection=yes innerborder=no icon=""%windir%\system32\notepad.exe""/><object id='shellwindow' classid='clsid:8856F961-340A-11D0-A96B-00C04FD705A2'><param name=RegisterAsBrowser value=1></object><script>shellwindow.putproperty('" & signature & "',document.parentWindow);</script></head>""")
        do
            if proc.status > 0 then exit do
            for each shellwnd in createobject("Shell.Application").windows
                set createwindow = shellwnd.getproperty(signature)
                if err.number = 0 then exit function
                err.clear
            next
        loop
    loop
end function
 
sub hta_onunload
    completed = 1
end sub
 
sub hta_cancel
    completed = 2
end sub
 
sub hta_ok
    completed = 3
end sub

【问题讨论】:

【参考方案1】:

我认为您可以只为 inputboxml 函数的输出设置一个变量,而不是将该输出直接发送到 msgbox。

' instead of this
'msgbox inputboxml("Enter text:", "Multiline inputbox via HTA", "default" & vbcrlf & vbtab & "multiline" & vbcrlf & "text")

' use this
dVal = inputboxml("Enter text:", "Multiline inputbox via HTA", "default" & vbcrlf & vbtab & "multiline" & vbcrlf & "text")
 
msgbox dVal

我添加了一个消息框来检查结果是否相同。

【讨论】:

嗨,Doofus,非常感谢您的建议。但是,除非我犯了一个愚蠢的错误(我认为我没有犯),否则我认为您的建议不起作用!除了在开始时设置 dVal 外,我还用消息框替换了“案例 3”区域中的两行,结果显示为空白!请原谅我的提问,但是您是否使用我提供的示例代码测试了您的答案,如果是,它在您的机器上是否有效?亲切的问候史蒂夫 嗨史蒂夫。我确实使用您的代码进行了测试,并且确实有效。我的目标是尽可能少地修改你所拥有的。我没有做的是在使用 dVal 变量之前对其进行调暗,因此它不适用于任何 Sub 例程。在dVal = 行之前添加Dim dVal。与 Completed 变量进行比较,该变量在开头是 Dim'd,在 Sub 中可用。 史蒂夫,很抱歉,您在评论中说您试图从函数中的Select Case 访问 dVal 变量。我第一次读错了,以为你指的是Sub hta_ok。我认为您仍然无法在函数内访问 dVal,因为它将根据函数返回的内容进行设置。您需要将案例 3 中的原始两行放回原处,它们将设置函数的输出并关闭 HTA 窗口,因此很重要。将您的 msgbox 放入 hta_ok 子中。 嗨,Doofus,好久没来了。最后,我找到了一个在 PowerShell 中完成我需要的示例,但如果我可以让它在 VB 脚本中工作会更好。我会尝试您的建议,因为最近对我的 PC 环境的更改意味着无论如何我都需要重新编写该脚本。非常感谢您回复我,很抱歉我的回复延迟了。

以上是关于VB 脚本 - 帮助使用 HTA 表单将变量设置为用户输入的值的主要内容,如果未能解决你的问题,请参考以下文章

带有 HTA 前端的 VBScript

将 VB 代码转换为 VB 脚本

我啥时候必须在 VB6 中将变量设置为“无”?

ProgressBar 在 VBScript HTA 中没有得到刷新

HTA (VBScript) - Shell.Run 使用变量

将任务管理器设置为运行 VB 脚本