В данной статье я решил рассмотреть способы создания диалогового окна базовыми способами – средствами Windows Script Host. В частности рассмотрены методы: BrowseForFolder, InputBox, Echo, MsgBox и Popup.
И так, приступим
BrowseForFolder
Создание диалогового окна для выбора папок и даже файлов осуществляется с помощью метода BrowseForFolder, что бы его использовать, надо прежде создать экземпляр объекта Application. Стоит взять на заметку, что поддержку осуществляет функция из библиотеки Shdocvw.dll, которая входит в состав Internet Explorer версий 4 и 5.
Также понадобится библиотека Shell32.dll версии 4.71 и выше, доступная в Windows 98 (версия 4.72) и Windows 2000 (версия 5). В Windows 95/NT 4 библиотека Shell32.dll версии 4.71 доступна, если установлен Internet Explorer 4 с обновлением Active Desktop. При установке Internet Explorer 5 в Windows 95/NT обновления Shell32.dll не происходит. Следует сначала установить Internet Explorer 4 с обновлением Active Desktop, а затем уже Internet Explorer 5.
Давайте создадим экземпляр объекта Shell.Application и посмотрим на синтаксис:
Set objDig = WScript.CreateObject("Shell.Application")Set objF = objDig.BrowseForFolder(hWnd, Titl, Options[, Root]) |
Рассмотрим описание параметров:
hWnd — передает создаваемому диалоговому окну описатель окна, он всегда должен быть равен 0, поскольку у сценария нет описателя.
Titl — задает строку, которая выводится в созданном диалоговом окне ниже заголовка.
Options — представляет собой 32-разрядный флаг, который задает внутренние свойства диалогового окна. Некоторые константы можно комбинировать (например, &Н0010 и &Н0001).
Root – необязательный, позволяет заранее выбрать папку. Путь может быть задан в виде строки (например, D:Data) или с помощью одного из значений, которые позволяют использовать специальную папку в пространстве имен оболочки. Список значений также описано в шпаргалке.
Давайте рассмотрим пример на VBScript для выбора каталогов:
' ***********************************************************' BrowseForFolder_folders.vbs' Создание диалогового окна выбора каталога на VBScript' ***********************************************************OptionExplicit' ФлагиConst BIF_returnonlyfsdirs = &H0001Const BIF_editbox = &H0010Dim wsh, objDlg, objF' Получить объект Application оболочки Windows.Set objDlg = WScript.CreateObject("Shell.Application")Set objF = objDlg.BrowseForFolder (&H0, _"Выберите каталог для копирования", BIF_editbox + BIF_returnonlyfsdirs)' Проверка условияIf isValue(objF) ThenMsgBox "Выбрано: " & objF.TitleElseMsgBox "Отменено"EndIf Function IsValue(obj)' Проверить, вернул ли метод какое-либо значение.Dim tmp OnErrorResumeNexttmp = "" & objIf Err <> 0 ThenIsValue = FalseElseIsValue = TrueEndIfOnErrorGoTo 0EndFunction |
В данном примере, с помощью BrowseForFolder происходит создание диалогового Windows окна для выбора папки, и возвращает сообщение, какой каталог был выделен или же ничего не было выбрано. Сам метод позволяет выбирать не только каталог, но и файлы.
Теперь рассмотрим пример на VBScript для выбора файлов:
' ***********************************************************' BrowseForFolder_files.vbs' Создание диалогового окна для выбор файла на VBScript' ************************************************************OptionExplicit' Флаги.Const BIF_returnonlyfsdirs = &H0001Const BIF_dontgobelowdomain = &H0002Const BIF_statustext = &H0004Const BIF_returnfsancestors = &H0008Const BIF_editbox = &H0010Const BIF_validate = &H0020Const BIF_browseforcomputer = &H1000Const BIF_browseforprinter = &H2000Const BIF_browseincludefiles = &H4000Dim filefile = BrowseForFoldr("Выберите файл или папку", BIF_returnonlyfsdirs + BIF_browseincludefiles, "")If file = "-5"ThenWScript.Echo "Выбран файл в корневой папке"ElseIf file = "-1"ThenWScript.Echo "Объект не выбран"ElseWScript.Echo "Объект: ", fileEndIfEndIf ' Получение полного пути к объектуFunction BrowseForFoldr(title, flag, dir)OnErrorResumeNextDim oShell, oItem, tmpSet oShell = WScript.CreateObject("Shell.Application")' Взывать диалоговое окно Browse For Folder.Set oItem = oShell.BrowseForFolder(&H0, title, flag, dir)If Err.Number <> 0 ThenIf Err.Number = 5 ThenBrowseForFoldr="-5"Err.ClearSet oShell = NothingSet oItem = NothingExitFunctionEndIfEndIf' Теперь попытаемся получить полный путь.BrowseForFoldr = oItem.ParentFolder.ParseName(oItem.title).Path' Обработка нажатия кнопки Cancel и выбора диска. If Err<> 0 ThenIf Err.Number = 424 Then ' Обработать кнопку Cancel.BrowseForFoldr ="-1"ElseErr.Clear' Обработать ситуацию, в которой пользователь выбирает диск.tmp = InStr(1, oItem.title, ":")If tmp > 0 Then ' Символ ":" найден; взять два символа и добавить .BrowseForFoldr = Mid(oItem.Title, (tmp - 1), 2) & ""EndIfEndIfEndIfSet oShell = NothingSet oItem = NothingOnErrorGoTo 0EndFunction |
InputBox
Теперь давайте рассмотрим функцию InputBox, которая позволяет получить информации от пользователя. Стоит упомянуть, что функция InputBox поддерживается только языком VBScript. Давайте посмотрим на ее общий синтаксис:
result = InputBox(текст[, [заголовок], [умолчание], [поз-Х], [поз-У]])

Описание ключей таковы.
Текст — Необходимый параметр, определяющий сообщение, которое выводится в диалоговом окне.
Заголовок — Необязательный, определяющий текст заголовка диалогового окна.
Умолчание — Необязательный, задающий значение по умолчанию для текстового поля.
Поз-Х иПоз-У — Необязательные, определяющие положение верхнего левого угла диалогового окна.
Есть еще два необязательных ключа helpflle и context, с их помощью можно создавать встроенную справку, хотя, как правило, в данном контексте в этом нет необходимости.
Если необязательный ключ не задан, VBScript использует значение по умолчанию. Чтобы опустить необязательный параметр, надо оставить его место между двумя запятыми пустым:
InputBox("Привет", "Тест", , 100, 200) |
В отличие от MsgBox ключа для кнопки у функции InputBox нет. Результат, возвращаемый InputBox при закрытии, зависит от того, какая кнопка была нажата: ОК возвращает содержимое текстового поля (т. е. данные, введенные пользователем), a Cancel отменяет результаты ввода и возвращает пустую строку. Переменная result позволяет проверить, ввел ли человек действительную информацию.
' ***********************************************************' InputBox.vbs' Создание диалогового окна для получение вводимой информации на VBScript'****************************************************************OptionExplicitDim Message, resultDim Title, Text1, Text2' Определить переменные диалоговых окон.Message = "Диалоговое окно на VBScript"Title = "Создание пользовательского диалогового окна "Text1 = "Было нажато на отмену"Text2 = "Вы ввели:" & vbCrLf' Все готово для использования функции InputBox;result = InputBox(Message, Title, "Ввод данных", 100, 100)' Обработать введенную информацию.If result = ""Then ' ОтменаWScript.Echo Text1ElseWScript.Echo Text2 & resultEndIf |
Echo
Метод Echo можно применять как в VBScript, так и в языке Jscript. Существенных отличий в синтаксисе нет. Ниже приводится простой пример диалогового окна, которое будет выводить сообщение для пользователя:
WScript.Echo " VBScript, vbYesNo ровно: ", vbYesNo
|
WScript.Echo("Jscript, Math.E ровно: ",Math.E); |

Как видим, все предельно просто, в кавычках мы прописали текст, а далее после запятой следовала константа, значение которой должно быть показано пользователю. Для перевода строки также надо использовать константы или ESC-последовательность:
WScript.Echo "Первая строка" & vbCrLf &"Вторая строка" |
WScript.Echo("Первая строка<strong>n","Вторая строка<strong>n");</strong></strong> |
Тут, для JS мы взяли ESC-последовательность «n» , а для VBS – vbCrLf константу.
MsgBox
MsgBox позволяет создавать диалоговое окно только сценариями языка VBS, в отличии от метода Echo она имеет в своем составе больший функционал – число кнопок, название окна, ну и, естественно, сам текст. Общий синтаксис таков:
MsgBox(prompt[,buttons][,title][,helpfile,context])
prompt – является обязательным и отвечает за текст, выводимый диалоговым окном
buttons – необязательный, целое число или константа (количество и тип кнопок, вид значка, установка фокуса)
title – также не является обязательным, определяет название окна
helpfile – задает путь к файлу-справке, файл-справка должен иметь расширение .hlp
context – число, которое задает раздел справки
Вот простой пример:
MsgBox "Пример с двумя кнопками", 1, "Пример работы" |
Фактически, ключи для кнопок и заголовок можно опустить, тогда мы получим результат, идентичный Echo. С помощью констант можно задавать тип, фокус и количество кнопок. В добавок, вы можете определить и значок для создаваемого диалогового окна, то есть, вы вправе комбинировать константы, смотрим:
MsgBox "Как сделать вывод диалогового окна с двумя кнопками и значком", vbOkCancel+vbInformation, "Cкрипт" |
Теперь давайте посмотрим, как работают два последних ключа helpfile и context, ведь с их помощью можно задать справку. Тут нам понадобится константа vbMsgBoxHelpButton, смотрим на код:
MsgBox "Как сделать пример диалогового окна со справкой", vbMsgBoxHelpButton, "Cкрипт", "filemon.hlp ", 1 |
Не знаю почему, но ничего не получилось, выбивает ошибку:
Раздел не существует. Обратитесь к поставщику продукта за обновленной версией файла справки. (129)
Возможно, есть некие подводные камни, Ну да ладно. Важно еще и то, что функция MsgBox возвращает результат, который можно присвоить переменной, с помощью него можно определить, на что нажал пользователь. Смотрим на код:
' ***********************************************************' MsgBox.vbs' Создание диалогового окна с помощью MsgBox'**********************************************************************OptionExplicitDim Resultresult = MsgBox("Определяем, на что было нажато", vbOkCancel+ vbInformation, "Заголовок")If result = vbOK ThenWScript.Echo "Нажата клавиша ОК"ElseWScript.Echo "Нажата клавиша Отмена"EndIf |
Popup
Теперь давайте россмотрим пример, как осуществить создание диалогового окна используя метод Popup, который сам по себе не является частью языка сценариев. Он входит в состав объектной модели WSH и поддерживается объектом WshShell. По своим характеристикам, он является аналогом функции MsgBox. Прежде всего, в сценарии нужно создать экземпляр объекта WshShеll. Для этого можно применить функцию CreateObject. Давайте посмотрим, на начальные строки для будущих примеров.
И так, создаем экземпляр компонента:
var WshShell = WScript.CreateObject("WScript.Shell");//JScript |
Set WshShell = WScript.CreateObject("WScript.Shell") ' VBScript |
Теперь мы сможем использовать переменную WshShеll для вызова функции Popup. Теперь давайте рассмотрим общий синтаксис:
WshShell.Popup (текст, таймаут, заголовок, кнопки);
Тут передаются следующие параметры:
Текст – собственно, тот текст, что надо вывести в диалоге. Тут можно использовать конкатенацию (объединение) констант, подстрок и переменных.
Таймаут – время, через которое будет закрыто пользовательское окошко, если от пользователя не поступят команды на закрытие. Для отключения тайм аута надо присвоить значение 0.
Заголовок – собственно, заголовок создаваемого окна.
Кнопки – тут используются константы, которые задают вид и количество кнопок.
Сам метод возвращает код кнопки, которой пользователь закрыл окно. Теперь давайте рассмотрим по одному примеру как создавать диалоговое окно для VBScript и Jscript синтаксиса.
// ***********************************************************// Pорup.js// Создание диалогового окна с помощью метода Pорup// *********************************************************// Объявляем переменные для управления диалогомvar vbOKCancel =1;var vbOK =1;var vbInformation =64;var vbCancel =2;var resultat;var Message ="Нажмите на клавишу";var Title ="Работа с функцией Pоpup";var WshShell = WScript.CreateObject("WScript.Shell");// Выводим диалоговое окноresultat = WshShell.Popup(Message,0,Title, vbOKCancel + vbInformation);// Условие для проверки, на что нажал пользовательif(resultat == vbOK){ WScript.Echo("Нажато на OK "+"(Код: "+ resultat +")");}else{ WScript.Echo("Нажато на Отмена "+"(Код: "+ resultat +")");}WScript.Echo("Выход из программы"); |
Ну и пример на VBScript:
' ***********************************************************' Pорup.vbs' Создание диалогового окна с помощью метода Pорup' *************************************************************OptionExplicitDim Message, Title, result, WShellMessage = "Нажмите на кнопку"Title = "Работа с методом Poрuр"' Создаем экземпляр объекта WshShell .Set WShell = WScript.CreateObject("WScript.Shell")' Выводим диалоговое окно с помощью функции Poрuр,result = WShell.Popup(Message, 0, Title, vbOKCancel + vbInformation)' Условие для проверки, на что нажал пользовательif (result = vbOK) then WScript.Echo "Кликнуто на OK " & "(Код: " & result & ")"else WScript.Echo "Кликнуто на Отмена " & "(Код: " & result & ")"EndifWScript.Echo "Выход из программы" |