1

Тема: VBScript: конструирование и выдача диалогов с помощью HTA

Порядок работы примера:
1) Запускается основной скрипт.
2) Процедура Run генерирует случайное число и запускает HTA файл, передавая это число параметром.
3) В HTA файле создаётся компонент WebBrowser, отсекает переданное число от хвоста commandline и выставляет WebBrowser-у свойство ID с этим числом.
4) Основной скрипт в это время ждёт появления WebBrowser-а с таким ID.
start.vbs

Dim WebBrowser,Window,Document

Set WebBrowser = Run("form.hta")

Set Document = WebBrowser.Document
Set Window = Document.ParentWindow
Document.body.onunload = GetRef("window_onunload")
Window.CommandButton1.onclick=GetRef("GetVars")

Sub GetVars
    MsgBox Window.InputBox1.value & vbCrlf & Window.InputBox2.value
    window.close
End Sub

Sub Window_onunload
    ExitDo = True
End Sub

'// Цикл ожидания события
Do
    WScript.Sleep 100
Loop Until ExitDo


'// Функция запуска HTA
Function Run(filename)
    Set Run = Nothing
    
    
    Dim WshShell
    Set WshShell = CreateObject("Wscript.Shell")
    
    Dim ID
    
    Randomize
    '// Создаём уникальный ID и передаём в 
    ID = Clng(Rnd * 100000)
    
    WshShell.Run filename & " " & ID

    Set ShellApplication = CreateObject("Shell.Application")

    For N=1 to 1000
        For Each Window in ShellApplication.Windows
            if Window.GetProperty("ID") = ID Then
                Set Run = Window
                Exit Function
            End if
        Next
    Next
    Err.Raise vbObjectError + 1,"Run","Не удалось получить связь с окном HTA"
End Function

connector.vbs

if IsObject(window) Then window.attachevent "onload",GetRef("Main")
Sub Main
    Dim CommandLine,Pos
    CommandLine = Document.all.tags("APPLICATION")(0).CommandLine
    Pos = InstrRev(CommandLine," ")
    CommandLine = mid(CommandLine,Pos + 1,Len(CommandLine)-Pos)
    if CommandLine = "" Then Exit Sub
    Set WebBrowser = Document.createElement("OBJECT")
    WebBrowser.classid = "clsid:8856F961-340A-11D0-A96B-00C04FD705A2"
    WebBrowser.RegisterAsBrowser = True
    Document.appendchild WebBrowser
    WebBrowser.PutProperty "ID",Clng(CommandLine)
End Sub

form.hta

<!--Скрипт для создания соединения с VBS //--!>
<SCRIPT language=vbscript src="connector.vbs"></SCRIPT>
<!--Скрипт для создания соединения с VBS //--!>

<SCRIPT language=vbscript>
Window.ResizeTo 400,200
</SCRIPT>

<HTA:APPLICATION
ID="APPLICATION"
APPLICATIONNAME="Application"
BORDER="dialog"
BORDERSTYLE="normal"
CAPTION="yes"
ICON=""
MAXIMIZEBUTTON="no"
MINIMIZEBUTTON="no"
SHOWINTASKBAR="yes"
SINGLEINSTANCE="no"
SYSMENU="yes"
VERSION="1.0"
WINDOWSTATE="normal" 
INNERBORDER="no"
SCROLL="no"
CONTEXTMENU="yes"
/>

<STYLE>
*.*
{
FONT-FAMILY:Verdana;
FONT-SIZE:11;
}
</STYLE>

<BODY>
    <TABLE width=100% height=100%>
        <TR><TD>Param1</TD><TD><INPUT width=100% id="inputBox1"></TD></TR>
        <TR><TD>Param2</TD><TD><INPUT width=100% id="inputBox2"></TD></TR>
        <TR><TD colspan=2><INPUT type="button" style="width:100%" id="CommandButton1" value="OK"></TD></TR>
    </TABLE>
</BODY>

Примечание: connector.vbs не обязательно должен находиться в отдельном файле, его можно вставить и в саму форму (в код HTA). Вынос этого скрипта имеет смысл, если HTA-форм много.
Автор примеров - Xameleon.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

2

Re: VBScript: конструирование и выдача диалогов с помощью HTA

Улучшенный вариант предыдущего.
1) В панели задач больше не появляется пустой заголовок. Создание объекта WebBrowser сделано через Document.write.
2) Оптимизирована работа с коллекцией ShellApplication.Windows.
3) Заблокировано нажатие F5 на форме HTA, приводящее к обновлению формы (обрабатывается событие Document.onkeydown).
start.vbs

Option Explicit

Dim WebBrowser,Window,Document,ExitDo

Set WebBrowser = Run("form.hta")

Set Document = WebBrowser.Document
Set Window = Document.ParentWindow
Document.title = "Form1"
Document.body.onunload = GetRef("window_onunload")
Window.CommandButton1.onclick=GetRef("GetVars")

Sub GetVars
    MsgBox Window.InputBox1.value & vbCrlf & Window.InputBox2.value
    window.close
End Sub

Sub Window_onunload
    ExitDo = True
End Sub

'// Цикл ожидания события
Do
    WScript.Sleep 100
Loop Until ExitDo


'// Функция запуска HTA
Function Run(filename)
    Set Run = Nothing
        
    Dim WshShell
    Set WshShell = CreateObject("Wscript.Shell")
    
    Dim ID
    
    Randomize
    '// Создаём уникальный ID и передаём в 
    ID = Clng(Rnd * 100000)
    
    WshShell.Run filename & " " & ID
    Dim Windows,Counter
    Set Windows = CreateObject("Shell.Application").Windows

    For Counter = 1 to 1000
        For Each Window in Windows
            if Window.GetProperty("ID") = ID Then
                Set Run = Window
                Exit Function
            End if
        Next
    Next
    Err.Raise vbObjectError + 1,"Run","Не удалось получить связь с окном HTA"
End Function

connector.vbs

if IsObject(Window) Then
    Document.write "<OBJECT id=""WebBrowser"" classid=""clsid:8856F961-340A-11D0-A96B-00C04FD705A2""><PARAM name=""RegisterAsBrowser"" value=1></OBJECT>"
    Document.attachevent "onkeydown",GetRef("Document_onkeydown_event")
    window.attachevent "onload",GetRef("onload_event")
End if

Sub onload_event
    CommandLine = Document.all.tags("APPLICATION")(0).CommandLine
    Pos = InstrRev(CommandLine," ")
    CommandLine = mid(CommandLine,Pos + 1,Len(CommandLine)-Pos)
    if CommandLine = "" Then Exit Sub
    WebBrowser.RegisterAsBrowser = True
    WebBrowser.style.display = "none"
    WebBrowser.RegisterAsDropTarget = False
    WebBrowser.Visible = False
    WebBrowser.PutProperty "ID",Clng(CommandLine)
End Sub

Function Document_onkeydown_event
    if window.event.keycode = 116 Then Document_onkeydown_event = false
End Function

form.hta

<!- Скрипт для создания соединения с VBS -!>
<SCRIPT language=vbscript src="connector.vbs"></SCRIPT>
<!- Скрипт для создания соединения с VBS -!>

<SCRIPT language=vbscript>
Window.ResizeTo 400,200
</SCRIPT>

<HTA:APPLICATION
ID="APPLICATION"
APPLICATIONNAME="Application"
BORDER="dialog"
BORDERSTYLE="normal"
CAPTION="yes"
ICON=""
MAXIMIZEBUTTON="no"
MINIMIZEBUTTON="no"
SHOWINTASKBAR="yes"
SINGLEINSTANCE="no"
SYSMENU="yes"
VERSION="1.0"
WINDOWSTATE="normal" 
INNERBORDER="no"
SCROLL="no"
CONTEXTMENU="yes"
/>

<STYLE>
*.*
{
FONT-FAMILY:Verdana;
FONT-SIZE:11;
}
</STYLE>

<BODY bgcolor="#D4D0C8">
    <TABLE width=100% height=100%>
        <TR><TD>Param1</TD><TD><INPUT width=100% id="inputBox1"></TD></TR>
        <TR><TD>Param2</TD><TD><INPUT width=100% id="inputBox2"></TD></TR>
        <TR><TD colspan=2><INPUT type="button" style="width:100%" id="CommandButton1" value="OK"></TD></TR>
    </TABLE>
</BODY>

Автор примеров - Xameleon.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

3

Re: VBScript: конструирование и выдача диалогов с помощью HTA

Функция, которая возвращает ссылку на объект окна HTA. В качестве аргумента принимает словарь с параметрами тега HTA. Получаем ссылку на объект окна HTA и формируем диалоговую форму с двумя полями ввода с помощью объектной модели DOM:

Option Explicit
Dim ExitDo, oHTA, oDict, oBody, oElem, oText
Dim val_1, val_2, ok
'==================================================================================================
Function GetHTADialog(ByRef Params)
    Dim oFSO, oWshShell, oWindows, oTextStream, oWnd, oWindow
    Dim sHTAFileName, ID, N
    
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oWshShell = CreateObject("WScript.Shell")
    Set oWindows = CreateObject("Shell.Application").Windows
    
    ' формирование имени будущего файла HTA
    sHTAFileName = oWshShell.ExpandEnvironmentStrings("%TEMP%") & "\" & oFSO.GetTempName() & ".hta"
    ' создание файла HTA
    Set oTextStream = oFSO.CreateTextFile(sHTAFileName, True)
    ' заполнение файла HTA
    With oTextStream
        .WriteLine "<HTML><HEAD>"
        .WriteLine "<OBJECT classid=""clsid:8856F961-340A-11D0-A96B-00C04FD705A2"""
        .WriteLine "id=""WebBrowserTemplate"" width=""0"" height=""0"">"
        .WriteLine "</OBJECT><TITLE></TITLE>"
        .WriteLine "<SCRIPT language=vbscript>"
        .WriteLine "If IsObject(window) Then"
        .WriteLine "    window.attachevent ""onload"", GetRef(""Main"")"
        .WriteLine "    document.attachevent ""onkeydown"", GetRef(""Document_onkeydown_event"")"
        .WriteLine "End If"
        .WriteLine "Sub Main"
        .WriteLine "    CommandLine = Document.all.tags(""APPLICATION"")(0).CommandLine"
        .WriteLine "    Pos = InstrRev(CommandLine, "" "")"
        .WriteLine "    CommandLine = Mid(CommandLine, Pos + 1, Len(CommandLine) - Pos)"
        .WriteLine "    If CommandLine = """" Then Exit Sub"
        .WriteLine "    Set WebBrowser = Document.GetElementById(""WebBrowserTemplate"")"
        .WriteLine "    WebBrowser.RegisterAsBrowser = True"
        .WriteLine "    WebBrowser.style.display = ""none"""
        .WriteLine "    WebBrowser.RegisterAsDropTarget = False"
        .WriteLine "    WebBrowser.Visible = False"
        .WriteLine "    WebBrowser.PutProperty ""ID"", Clng(CommandLine)"
        .WriteLine "End Sub"
        .WriteLine "Function Document_onkeydown_event" ' блокировка F5 (refresh)
        .WriteLine "    If window.event.keycode = 116 Then Document_onkeydown_event = false"
        .WriteLine "End Function"
        .WriteLine "</SCRIPT>"
        .WriteLine "<HTA:APPLICATION"
        .WriteLine "APPLICATIONNAME=""" & Params.Item("APPLICATIONNAME") & """"
        If Params.Exists("BORDER") Then
            .WriteLine "BORDER=""" & Params.Item("BORDER") & """"
        Else
            .WriteLine "BORDER=""thick"""
        End If
        If Params.Exists("BORDERSTYLE") Then
            .WriteLine "BORDERSTYLE=""" & Params.Item("BORDERSTYLE") & """"
        Else
            .WriteLine "BORDERSTYLE=""normal"""
        End If
        If Params.Exists("CAPTION") Then
            .WriteLine "CAPTION=""" & Params.Item("CAPTION") & """"
        Else
            .WriteLine "CAPTION=""yes"""
        End If
        If Params.Exists("CONTEXTMENU") Then
            .WriteLine "CONTEXTMENU=""" & Params.Item("CONTEXTMENU") & """"
        Else
            .WriteLine "CONTEXTMENU=""yes"""
        End If
        If Params.Exists("ICON") Then
            .WriteLine "ICON=""" & Params.Item("ICON") & """"
        Else
            .WriteLine "ICON=""System Application Icon"""
        End If
        If Params.Exists("INNERBORDER") Then
            .WriteLine "INNERBORDER=""" & Params.Item("INNERBORDER") & """"
        Else
            .WriteLine "INNERBORDER=""yes"""
        End If
        If Params.Exists("MAXIMIZEBUTTON") Then
            .WriteLine "MAXIMIZEBUTTON=""" & Params.Item("MAXIMIZEBUTTON") & """"
        Else
            .WriteLine "MAXIMIZEBUTTON=""yes"""
        End If
        If Params.Exists("MINIMIZEBUTTON") Then
            .WriteLine "MINIMIZEBUTTON=""" & Params.Item("MINIMIZEBUTTON") & """"
        Else
            .WriteLine "MINIMIZEBUTTON=""yes"""
        End If
        If Params.Exists("NAVIGABLE") Then
            .WriteLine "NAVIGABLE=""" & Params.Item("NAVIGABLE") & """"
        Else
            .WriteLine "NAVIGABLE=""no"""
        End If
        If Params.Exists("SCROLL") Then
            .WriteLine "SCROLL=""" & Params.Item("SCROLL") & """"
        Else
            .WriteLine "SCROLL=""yes"""
        End If
        If Params.Exists("SCROLLFLAT") Then
            .WriteLine "SCROLLFLAT=""" & Params.Item("SCROLLFLAT") & """"
        Else
            .WriteLine "SCROLLFLAT=""no"""
        End If
        If Params.Exists("SELECTION") Then
            .WriteLine "SELECTION=""" & Params.Item("SELECTION") & """"
        Else
            .WriteLine "SELECTION=""yes"""
        End If
        If Params.Exists("SHOWINTASKBAR") Then
            .WriteLine "SHOWINTASKBAR=""" & Params.Item("SHOWINTASKBAR") & """"
        Else
            .WriteLine "SHOWINTASKBAR=""yes"""
        End If
        If Params.Exists("SINGLEINSTANCE") Then
            .WriteLine "SINGLEINSTANCE=""" & Params.Item("SINGLEINSTANCE") & """"
        Else
            .WriteLine "SINGLEINSTANCE=""no"""
        End If
        If Params.Exists("SYSMENU") Then
            .WriteLine "SYSMENU=""" & Params.Item("SYSMENU") & """"
        Else
            .WriteLine "SYSMENU=""yes"""
        End If
        If Params.Exists("VERSION") Then
            .WriteLine "VERSION=""" & Params.Item("VERSION") & """"
        Else
            .WriteLine "VERSION=""1.0"""
        End If
        If Params.Exists("WINDOWSTATE") Then
            .WriteLine "WINDOWSTATE=""" & Params.Item("WINDOWSTATE") & """"
        Else
            .WriteLine "WINDOWSTATE=""normal"""
        End If
        If Params.Exists("ID") Then
            .WriteLine "ID=""" & Params.Item("ID") & """"
        Else
            .WriteLine "ID=""oHTA"""
        End If
        .WriteLine "/>"
        .WriteLine "</HEAD><BODY></BODY></HTML>"
        .Close
    End With
    Randomize
    ID = Clng(Rnd * 100000)
    oWshShell.Run sHTAFileName & " " & ID
    ' поиск окна HTA
    Set oWnd = Nothing
    For N = 1 to 1000
        For Each oWindow in oWindows
            If oWindow.GetProperty("ID") = ID Then
                Set oWnd = oWindow
                Exit For
            End If
        Next
        If Not oWnd Is Nothing Then Exit For
    Next
    ' удаление файла HTA
    oFSO.DeleteFile sHTAFileName, True
    ' возвращаем ссылку на окно HTA
    Set GetHTADialog = oWnd
End Function
'==================================================================================================
Sub HTA_OnUnload
    ExitDo = True
End Sub
Sub CloseHTA
    oHTA.document.parentWindow.close
End Sub
Sub OK_HTA
    val_1 = oHTA.document.parentWindow.input_1.value
    val_2 = oHTA.document.parentWindow.input_2.value
    oHTA.document.parentWindow.close
    ok = True
End Sub
'==================================================================================================
Set oDict = CreateObject("Scripting.Dictionary")
oDict.Add "CONTEXTMENU", "no"
oDict.Add "INNERBORDER", "no"
oDict.Add "SCROLL", "no"
oDict.Add "BORDER", "dialog"
oDict.Add "BORDERSTYLE", "raised"
oDict.Add "MAXIMIZEBUTTON", "no"
oDict.Add "MINIMIZEBUTTON", "no"
ok = False
Set oHTA = GetHTADialog(oDict)
If oHTA Is Nothing Then
    WScript.Echo "Не удалось получить связь с окном HTA."
    WScript.Quit
End If
' назначаем обработчик события выгрузки (закрытия) формы
oHTA.document.body.onunload = GetRef("HTA_OnUnload")
' задаём размеры формы
oHTA.document.parentWindow.resizeTo 350, 250
' получаем объет тела HTML-документа
Set oBody = oHTA.document.getElementsByTagName("body")(0)
' задаём цвет фона
oBody.bgcolor = "#E0E0E0"
' создаём текстовый элемент
oHTA.document.title = "Ввод значений"
Set oElem = oHTA.Document.createElement("p")
Set oText = oHTA.Document.createTextNode("Введите текстовое значение:")
oElem.appendChild oText
oBody.appendChild oElem
' создаём текстовое поле ввода
Set oElem = oHTA.Document.createElement("input")
oElem.setAttribute "width", "320"
oElem.setAttribute "id", "input_1"
oBody.appendChild oElem
' создаём текстовый элемент
Set oElem = oHTA.Document.createElement("p")
Set oText = oHTA.Document.createTextNode("Выберите файл:")
oElem.appendChild oText
oBody.appendChild oElem
' создаём поле выбора файла
Set oElem = oHTA.Document.createElement("input")
oElem.setAttribute "type", "file"
oElem.setAttribute "width", "320"
oElem.setAttribute "id", "input_2"
oBody.appendChild oElem
' создаём разделители
Set oElem = oHTA.Document.createElement("br")
oBody.appendChild oElem
Set oElem = oHTA.Document.createElement("br")
oBody.appendChild oElem
' создаём кнопку
Set oElem = oHTA.Document.createElement("button")
oElem.setAttribute "value", "&nbsp;&nbsp;&nbsp;&nbsp;О'кей&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
oElem.onclick = GetRef("OK_HTA")
oBody.appendChild oElem
' создаём текстовый элемент
Set oText = oHTA.Document.createTextNode("             ")
oBody.appendChild oText
' создаём кнопку
Set oElem = oHTA.Document.createElement("button")
oElem.setAttribute "value", "Отменить"
oElem.onclick = GetRef("CloseHTA")
oBody.appendChild oElem
Do ' ожидание закрытия окна HTA
    WScript.Sleep 100
Loop Until ExitDo
If ok Then
    WScript.Echo "Введено текстовое значение: " & val_1
    WScript.Echo "Выбран файл: " & val_2
Else
    WScript.Echo "Окно HTA было закрыто кнопкой ""Отменить""."
End If

Другой вариант предыдущего примера. Делаем ту же диалоговую форму, но с помощью передачи строки HTML-кода:

Option Explicit
Dim ExitDo, oHTA, oDict, oBody, oElem, oText
Dim val_1, val_2, ok, strHTML
'==================================================================================================
Function GetHTADialog(ByRef Params)
    Dim oFSO, oWshShell, oWindows, oTextStream, oWnd, oWindow
    Dim sHTAFileName, ID, N
    
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oWshShell = CreateObject("WScript.Shell")
    Set oWindows = CreateObject("Shell.Application").Windows
    
    ' формирование имени будущего файла HTA
    sHTAFileName = oWshShell.ExpandEnvironmentStrings("%TEMP%") & "\" & oFSO.GetTempName() & ".hta"
    ' создание файла HTA
    Set oTextStream = oFSO.CreateTextFile(sHTAFileName, True)
    ' заполнение файла HTA
    With oTextStream
        .WriteLine "<HTML><HEAD>"
        .WriteLine "<OBJECT classid=""clsid:8856F961-340A-11D0-A96B-00C04FD705A2"""
        .WriteLine "id=""WebBrowserTemplate"" width=""0"" height=""0"">"
        .WriteLine "</OBJECT><TITLE></TITLE>"
        .WriteLine "<SCRIPT language=vbscript>"
        .WriteLine "If IsObject(window) Then"
        .WriteLine "    window.attachevent ""onload"", GetRef(""Main"")"
        .WriteLine "    document.attachevent ""onkeydown"", GetRef(""Document_onkeydown_event"")"
        .WriteLine "End If"
        .WriteLine "Sub Main"
        .WriteLine "    CommandLine = Document.all.tags(""APPLICATION"")(0).CommandLine"
        .WriteLine "    Pos = InstrRev(CommandLine, "" "")"
        .WriteLine "    CommandLine = Mid(CommandLine, Pos + 1, Len(CommandLine) - Pos)"
        .WriteLine "    If CommandLine = """" Then Exit Sub"
        .WriteLine "    Set WebBrowser = Document.GetElementById(""WebBrowserTemplate"")"
        .WriteLine "    WebBrowser.RegisterAsBrowser = True"
        .WriteLine "    WebBrowser.style.display = ""none"""
        .WriteLine "    WebBrowser.RegisterAsDropTarget = False"
        .WriteLine "    WebBrowser.Visible = False"
        .WriteLine "    WebBrowser.PutProperty ""ID"", Clng(CommandLine)"
        .WriteLine "End Sub"
        .WriteLine "Function Document_onkeydown_event" ' блокировка F5 (refresh)
        .WriteLine "    If window.event.keycode = 116 Then Document_onkeydown_event = false"
        .WriteLine "End Function"
        .WriteLine "</SCRIPT>"
        .WriteLine "<HTA:APPLICATION"
        .WriteLine "APPLICATIONNAME=""" & Params.Item("APPLICATIONNAME") & """"
        If Params.Exists("BORDER") Then
            .WriteLine "BORDER=""" & Params.Item("BORDER") & """"
        Else
            .WriteLine "BORDER=""thick"""
        End If
        If Params.Exists("BORDERSTYLE") Then
            .WriteLine "BORDERSTYLE=""" & Params.Item("BORDERSTYLE") & """"
        Else
            .WriteLine "BORDERSTYLE=""normal"""
        End If
        If Params.Exists("CAPTION") Then
            .WriteLine "CAPTION=""" & Params.Item("CAPTION") & """"
        Else
            .WriteLine "CAPTION=""yes"""
        End If
        If Params.Exists("CONTEXTMENU") Then
            .WriteLine "CONTEXTMENU=""" & Params.Item("CONTEXTMENU") & """"
        Else
            .WriteLine "CONTEXTMENU=""yes"""
        End If
        If Params.Exists("ICON") Then
            .WriteLine "ICON=""" & Params.Item("ICON") & """"
        Else
            .WriteLine "ICON=""System Application Icon"""
        End If
        If Params.Exists("INNERBORDER") Then
            .WriteLine "INNERBORDER=""" & Params.Item("INNERBORDER") & """"
        Else
            .WriteLine "INNERBORDER=""yes"""
        End If
        If Params.Exists("MAXIMIZEBUTTON") Then
            .WriteLine "MAXIMIZEBUTTON=""" & Params.Item("MAXIMIZEBUTTON") & """"
        Else
            .WriteLine "MAXIMIZEBUTTON=""yes"""
        End If
        If Params.Exists("MINIMIZEBUTTON") Then
            .WriteLine "MINIMIZEBUTTON=""" & Params.Item("MINIMIZEBUTTON") & """"
        Else
            .WriteLine "MINIMIZEBUTTON=""yes"""
        End If
        If Params.Exists("NAVIGABLE") Then
            .WriteLine "NAVIGABLE=""" & Params.Item("NAVIGABLE") & """"
        Else
            .WriteLine "NAVIGABLE=""no"""
        End If
        If Params.Exists("SCROLL") Then
            .WriteLine "SCROLL=""" & Params.Item("SCROLL") & """"
        Else
            .WriteLine "SCROLL=""yes"""
        End If
        If Params.Exists("SCROLLFLAT") Then
            .WriteLine "SCROLLFLAT=""" & Params.Item("SCROLLFLAT") & """"
        Else
            .WriteLine "SCROLLFLAT=""no"""
        End If
        If Params.Exists("SELECTION") Then
            .WriteLine "SELECTION=""" & Params.Item("SELECTION") & """"
        Else
            .WriteLine "SELECTION=""yes"""
        End If
        If Params.Exists("SHOWINTASKBAR") Then
            .WriteLine "SHOWINTASKBAR=""" & Params.Item("SHOWINTASKBAR") & """"
        Else
            .WriteLine "SHOWINTASKBAR=""yes"""
        End If
        If Params.Exists("SINGLEINSTANCE") Then
            .WriteLine "SINGLEINSTANCE=""" & Params.Item("SINGLEINSTANCE") & """"
        Else
            .WriteLine "SINGLEINSTANCE=""no"""
        End If
        If Params.Exists("SYSMENU") Then
            .WriteLine "SYSMENU=""" & Params.Item("SYSMENU") & """"
        Else
            .WriteLine "SYSMENU=""yes"""
        End If
        If Params.Exists("VERSION") Then
            .WriteLine "VERSION=""" & Params.Item("VERSION") & """"
        Else
            .WriteLine "VERSION=""1.0"""
        End If
        If Params.Exists("WINDOWSTATE") Then
            .WriteLine "WINDOWSTATE=""" & Params.Item("WINDOWSTATE") & """"
        Else
            .WriteLine "WINDOWSTATE=""normal"""
        End If
        If Params.Exists("ID") Then
            .WriteLine "ID=""" & Params.Item("ID") & """"
        Else
            .WriteLine "ID=""oHTA"""
        End If
        .WriteLine "/>"
        .WriteLine "</HEAD><BODY></BODY></HTML>"
        .Close
    End With
    Randomize
    ID = Clng(Rnd * 100000)
    oWshShell.Run sHTAFileName & " " & ID
    ' поиск окна HTA
    Set oWnd = Nothing
    For N = 1 to 1000
        For Each oWindow in oWindows
            If oWindow.GetProperty("ID") = ID Then
                Set oWnd = oWindow
                Exit For
            End If
        Next
        If Not oWnd Is Nothing Then Exit For
    Next
    ' удаление файла HTA
    oFSO.DeleteFile sHTAFileName, True
    ' возвращаем ссылку на окно HTA
    Set GetHTADialog = oWnd
End Function
'==================================================================================================
Sub HTA_OnUnload
    ExitDo = True
End Sub
Sub CloseHTA
    oHTA.document.parentWindow.close
End Sub
Sub OK_HTA
    val_1 = oHTA.document.parentWindow.input_1.value
    val_2 = oHTA.document.parentWindow.input_2.value
    oHTA.document.parentWindow.close
    ok = True
End Sub
'==================================================================================================
Set oDict = CreateObject("Scripting.Dictionary")
oDict.Add "CONTEXTMENU", "no"
oDict.Add "INNERBORDER", "no"
oDict.Add "SCROLL", "no"
oDict.Add "BORDER", "dialog"
oDict.Add "BORDERSTYLE", "raised"
oDict.Add "MAXIMIZEBUTTON", "no"
oDict.Add "MINIMIZEBUTTON", "no"
ok = False
Set oHTA = GetHTADialog(oDict)
If oHTA Is Nothing Then
    WScript.Echo "Не удалось получить связь с окном HTA."
    WScript.Quit
End If
' назначаем обработчик события выгрузки (закрытия) формы
oHTA.document.body.onunload = GetRef("HTA_OnUnload")
' задаём размеры формы
oHTA.document.parentWindow.resizeTo 350, 250
' получаем объет тела HTML-документа
Set oBody = oHTA.document.getElementsByTagName("body")(0)
' задаём цвет фона
oBody.bgcolor = "#E0E0E0"
' формируем строку HTML-кода
strHTML = ""
strHTML = strHTML & "<P>Введите текстовое значение:</P>"
strHTML = strHTML & "<INPUT id=input_1 size=50>"
strHTML = strHTML & "<P>Выберите файл:</P>"
strHTML = strHTML & "<INPUT id=input_2 type=file size=37>"
strHTML = strHTML & "<BR><BR>"
strHTML = strHTML & "<BUTTON id=bOK>&nbsp;&nbsp;&nbsp;&nbsp;О'кей&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</BUTTON>"
strHTML = strHTML & "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
strHTML = strHTML & "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
strHTML = strHTML & "<BUTTON id=bCancel>Отменить</BUTTON>"
' записываем HTML-код в тело документа
oBody.innerHTML = strHTML
' назначение событий кнопкам
oHTA.document.parentWindow.bOK.onclick = GetRef("OK_HTA")
oHTA.document.parentWindow.bCancel.onclick = GetRef("CloseHTA")
Do ' ожидание закрытия окна HTA
    WScript.Sleep 100
Loop Until ExitDo
If ok Then
    WScript.Echo "Введено текстовое значение: " & val_1
    WScript.Echo "Выбран файл: " & val_2
Else
    WScript.Echo "Окно HTA было закрыто кнопкой ""Отменить""."
End If
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

4

Re: VBScript: конструирование и выдача диалогов с помощью HTA

Предыдущий пример с функцией. Добавлено закрытие диалога по Escape и возможность вызова модального окна выбора папок. Чтобы получить хэндл окна для его передачи функции BrowseForFolder (чтобы сделать окно выбора папок модальным), на форму вставляется объект MSScriptControl.

Option Explicit
Dim ExitDo, oHTA, oDict, oBody, oElem, oText
Dim val_1, val_2, val_3, ok, strHTML
'==================================================================================================
Function GetHTADialog(ByRef Params)
    Dim oFSO, oWshShell, oWindows, oTextStream, oWnd, oWindow
    Dim sHTAFileName, ID, N
    
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oWshShell = CreateObject("WScript.Shell")
    Set oWindows = CreateObject("Shell.Application").Windows
    
    ' формирование имени будущего файла HTA
    sHTAFileName = oWshShell.ExpandEnvironmentStrings("%TEMP%") & "\" & oFSO.GetTempName() & ".hta"
    ' создание файла HTA
    Set oTextStream = oFSO.CreateTextFile(sHTAFileName, True)
    ' заполнение файла HTA
    With oTextStream
        .WriteLine "<HTML><HEAD>"
        .WriteLine "<OBJECT classid=""clsid:8856F961-340A-11D0-A96B-00C04FD705A2"""
        .WriteLine "    id=""WebBrowserTemplate"" width=""0"" height=""0""></OBJECT>"
        .WriteLine "<OBJECT id=""MSScriptControl"" style=""display:none"" classid=""clsid:0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC"">"
        .WriteLine "    <PARAM name=""AllowUI"" value=1><PARAM name=""UseSafeSubSet"" value=1></OBJECT>"
        .WriteLine "<TITLE></TITLE>"
        .WriteLine "<SCRIPT language=vbscript>"
        .WriteLine "If IsObject(window) Then"
        .WriteLine "    window.attachevent ""onload"", GetRef(""Main"")"
        .WriteLine "    document.attachevent ""onkeydown"", GetRef(""Document_onkeydown_event"")"
        .WriteLine "End If"
        .WriteLine "Sub Main"
        .WriteLine "    CommandLine = Document.all.tags(""APPLICATION"")(0).CommandLine"
        .WriteLine "    Pos = InstrRev(CommandLine, "" "")"
        .WriteLine "    CommandLine = Mid(CommandLine, Pos + 1, Len(CommandLine) - Pos)"
        .WriteLine "    If CommandLine = """" Then Exit Sub"
        .WriteLine "    Set WebBrowser = Document.GetElementById(""WebBrowserTemplate"")"
        .WriteLine "    WebBrowser.RegisterAsBrowser = True"
        .WriteLine "    WebBrowser.style.display = ""none"""
        .WriteLine "    WebBrowser.RegisterAsDropTarget = False"
        .WriteLine "    WebBrowser.Visible = False"
        .WriteLine "    WebBrowser.PutProperty ""ID"", Clng(CommandLine)"
        .WriteLine "    WebBrowser.PutProperty ""HWND"", MSScriptControl.SiteHwnd"
        .WriteLine "End Sub"
        .WriteLine "Function Document_onkeydown_event"
        .WriteLine "    If window.event.keycode = 27 Then window.close()" ' закрытие по Esc
        .WriteLine "    If window.event.keycode = 116 Then Document_onkeydown_event = false" ' блокировка F5 (refresh)
        .WriteLine "End Function"
        .WriteLine "</SCRIPT>"
        .WriteLine "<HTA:APPLICATION"
        .WriteLine "APPLICATIONNAME=""" & Params.Item("APPLICATIONNAME") & """"
        If Params.Exists("BORDER") Then
            .WriteLine "BORDER=""" & Params.Item("BORDER") & """"
        Else
            .WriteLine "BORDER=""thick"""
        End If
        If Params.Exists("BORDERSTYLE") Then
            .WriteLine "BORDERSTYLE=""" & Params.Item("BORDERSTYLE") & """"
        Else
            .WriteLine "BORDERSTYLE=""normal"""
        End If
        If Params.Exists("CAPTION") Then
            .WriteLine "CAPTION=""" & Params.Item("CAPTION") & """"
        Else
            .WriteLine "CAPTION=""yes"""
        End If
        If Params.Exists("CONTEXTMENU") Then
            .WriteLine "CONTEXTMENU=""" & Params.Item("CONTEXTMENU") & """"
        Else
            .WriteLine "CONTEXTMENU=""yes"""
        End If
        If Params.Exists("ICON") Then
            .WriteLine "ICON=""" & Params.Item("ICON") & """"
        Else
            .WriteLine "ICON=""System Application Icon"""
        End If
        If Params.Exists("INNERBORDER") Then
            .WriteLine "INNERBORDER=""" & Params.Item("INNERBORDER") & """"
        Else
            .WriteLine "INNERBORDER=""yes"""
        End If
        If Params.Exists("MAXIMIZEBUTTON") Then
            .WriteLine "MAXIMIZEBUTTON=""" & Params.Item("MAXIMIZEBUTTON") & """"
        Else
            .WriteLine "MAXIMIZEBUTTON=""yes"""
        End If
        If Params.Exists("MINIMIZEBUTTON") Then
            .WriteLine "MINIMIZEBUTTON=""" & Params.Item("MINIMIZEBUTTON") & """"
        Else
            .WriteLine "MINIMIZEBUTTON=""yes"""
        End If
        If Params.Exists("NAVIGABLE") Then
            .WriteLine "NAVIGABLE=""" & Params.Item("NAVIGABLE") & """"
        Else
            .WriteLine "NAVIGABLE=""no"""
        End If
        If Params.Exists("SCROLL") Then
            .WriteLine "SCROLL=""" & Params.Item("SCROLL") & """"
        Else
            .WriteLine "SCROLL=""yes"""
        End If
        If Params.Exists("SCROLLFLAT") Then
            .WriteLine "SCROLLFLAT=""" & Params.Item("SCROLLFLAT") & """"
        Else
            .WriteLine "SCROLLFLAT=""no"""
        End If
        If Params.Exists("SELECTION") Then
            .WriteLine "SELECTION=""" & Params.Item("SELECTION") & """"
        Else
            .WriteLine "SELECTION=""yes"""
        End If
        If Params.Exists("SHOWINTASKBAR") Then
            .WriteLine "SHOWINTASKBAR=""" & Params.Item("SHOWINTASKBAR") & """"
        Else
            .WriteLine "SHOWINTASKBAR=""yes"""
        End If
        If Params.Exists("SINGLEINSTANCE") Then
            .WriteLine "SINGLEINSTANCE=""" & Params.Item("SINGLEINSTANCE") & """"
        Else
            .WriteLine "SINGLEINSTANCE=""no"""
        End If
        If Params.Exists("SYSMENU") Then
            .WriteLine "SYSMENU=""" & Params.Item("SYSMENU") & """"
        Else
            .WriteLine "SYSMENU=""yes"""
        End If
        If Params.Exists("VERSION") Then
            .WriteLine "VERSION=""" & Params.Item("VERSION") & """"
        Else
            .WriteLine "VERSION=""1.0"""
        End If
        If Params.Exists("WINDOWSTATE") Then
            .WriteLine "WINDOWSTATE=""" & Params.Item("WINDOWSTATE") & """"
        Else
            .WriteLine "WINDOWSTATE=""normal"""
        End If
        If Params.Exists("ID") Then
            .WriteLine "ID=""" & Params.Item("ID") & """"
        Else
            .WriteLine "ID=""oHTA"""
        End If
        .WriteLine "/>"
        .WriteLine "</HEAD><BODY></BODY></HTML>"
        .Close
    End With
    Randomize
    ID = Clng(Rnd * 100000)
    oWshShell.Run sHTAFileName & " " & ID
    ' поиск окна HTA
    Set oWnd = Nothing
    For N = 1 to 5000
        For Each oWindow in oWindows
            If oWindow.GetProperty("ID") = ID Then
                Set oWnd = oWindow
                Exit For
            End If
        Next
        If Not oWnd Is Nothing Then Exit For
        WScript.Sleep 100
    Next
    ' удаление файла HTA
    oFSO.DeleteFile sHTAFileName, True
    ' возвращаем ссылку на окно HTA
    Set GetHTADialog = oWnd
End Function
'==================================================================================================
Sub HTA_OnUnload
    ExitDo = True
End Sub
Sub CloseHTA
    oHTA.document.parentWindow.close
End Sub
Sub OK_HTA
    val_1 = oHTA.document.parentWindow.input_1.value
    val_2 = oHTA.document.parentWindow.input_2.value
    val_3 = oHTA.document.parentWindow.input_3.value
    oHTA.document.parentWindow.close
    ok = True
End Sub
Sub BrowseFolder
    Dim oFolder, oShellApp, oFSO
    Set oShellApp = CreateObject("Shell.Application")
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oFolder = oShellApp.BrowseForFolder(oHTA.GetProperty("HWND"), "Выбор папки", 81, "")
    If Not oFolder Is Nothing Then
        If oFSO.FolderExists(oFolder.Self.Path) Then
            oHTA.document.parentWindow.input_3.value = oFolder.Self.Path
        End If
    End If
End Sub
'==================================================================================================
Set oDict = CreateObject("Scripting.Dictionary")
oDict.Add "CONTEXTMENU", "no"
oDict.Add "INNERBORDER", "no"
oDict.Add "SCROLL", "no"
oDict.Add "BORDER", "dialog"
oDict.Add "BORDERSTYLE", "raised"
oDict.Add "MAXIMIZEBUTTON", "no"
oDict.Add "MINIMIZEBUTTON", "no"
ok = False
Set oHTA = GetHTADialog(oDict)
If oHTA Is Nothing Then
    WScript.Echo "Не удалось получить связь с окном HTA."
    WScript.Quit
End If
' назначаем обработчик события выгрузки (закрытия) формы
oHTA.document.body.onunload = GetRef("HTA_OnUnload")
' задаём размеры формы
oHTA.document.parentWindow.resizeTo 350, 320
' задаём заголовок окна
oHTA.document.title = "Заголовок диалога"
' получаем объет тела HTML-документа
Set oBody = oHTA.document.getElementsByTagName("body")(0)
' задаём цвет фона
oBody.bgcolor = "#E0E0E0"
' формируем строку HTML-кода
strHTML = ""
strHTML = strHTML & "<P>Введите текстовое значение:</P>"
strHTML = strHTML & "<INPUT id=input_1 size=50>"
strHTML = strHTML & "<P>Выберите файл:</P>"
strHTML = strHTML & "<INPUT id=input_2 type=file size=37>"
strHTML = strHTML & "<P>Выберите папку:</P>"
strHTML = strHTML & "<INPUT id=input_3 size=37>"
strHTML = strHTML & "<BUTTON id=bBrowse>Обзор...</BUTTON>"
strHTML = strHTML & "<BR><BR>"
strHTML = strHTML & "<BUTTON id=bOK>&nbsp;&nbsp;&nbsp;&nbsp;О'кей&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</BUTTON>"
strHTML = strHTML & "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
strHTML = strHTML & "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
strHTML = strHTML & "<BUTTON id=bCancel>Отменить</BUTTON>"
' записываем HTML-код в тело документа
oBody.innerHTML = strHTML
' назначение событий кнопкам
oHTA.document.parentWindow.bOK.onclick = GetRef("OK_HTA")
oHTA.document.parentWindow.bCancel.onclick = GetRef("CloseHTA")
oHTA.document.parentWindow.bBrowse.onclick = GetRef("BrowseFolder")
Do ' ожидание закрытия окна HTA
    WScript.Sleep 100
Loop Until ExitDo
If ok Then
    WScript.Echo "Введено текстовое значение: " & val_1
    WScript.Echo "Выбран файл: " & val_2
    WScript.Echo "Выбрана папка: " & val_3
Else
    WScript.Echo "Окно HTA было закрыто кнопкой ""Отменить""."
End If

Автор идеи - alexii.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.