В данной статье я решил рассмотреть способы создания диалогового окна базовыми способами – средствами 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 ' *********************************************************** Option Explicit ' Флаги Const BIF_returnonlyfsdirs = &H0001 Const BIF_editbox = &H0010 Dim wsh, objDlg, objF ' Получить объект Application оболочки Windows. Set objDlg = WScript.CreateObject("Shell.Application") Set objF = objDlg.BrowseForFolder (&H0, _ "Выберите каталог для копирования", BIF_editbox + BIF_returnonlyfsdirs) ' Проверка условия If isValue(objF) Then MsgBox "Выбрано: " & objF.Title Else MsgBox "Отменено" End If Function IsValue(obj) ' Проверить, вернул ли метод какое-либо значение. Dim tmp On Error Resume Next tmp = "" & obj If Err <> 0 Then IsValue = False Else IsValue = True End If On Error GoTo 0 End Function |
В данном примере, с помощью BrowseForFolder происходит создание диалогового Windows окна для выбора папки, и возвращает сообщение, какой каталог был выделен или же ничего не было выбрано. Сам метод позволяет выбирать не только каталог, но и файлы.
Теперь рассмотрим пример на VBScript для выбора файлов:
' *********************************************************** ' BrowseForFolder_files.vbs ' Создание диалогового окна для выбор файла на VBScript ' ************************************************************ Option Explicit ' Флаги. Const BIF_returnonlyfsdirs = &H0001 Const BIF_dontgobelowdomain = &H0002 Const BIF_statustext = &H0004 Const BIF_returnfsancestors = &H0008 Const BIF_editbox = &H0010 Const BIF_validate = &H0020 Const BIF_browseforcomputer = &H1000 Const BIF_browseforprinter = &H2000 Const BIF_browseincludefiles = &H4000 Dim file file = BrowseForFoldr("Выберите файл или папку", BIF_returnonlyfsdirs + BIF_browseincludefiles, "") If file = "-5" Then WScript.Echo "Выбран файл в корневой папке" Else If file = "-1" Then WScript.Echo "Объект не выбран" Else WScript.Echo "Объект: ", file End If End If ' Получение полного пути к объекту Function BrowseForFoldr(title, flag, dir) On Error Resume Next Dim oShell, oItem, tmp Set oShell = WScript.CreateObject("Shell.Application") ' Взывать диалоговое окно Browse For Folder. Set oItem = oShell.BrowseForFolder(&H0, title, flag, dir) If Err.Number <> 0 Then If Err.Number = 5 Then BrowseForFoldr="-5" Err.Clear Set oShell = Nothing Set oItem = Nothing Exit Function End If End If ' Теперь попытаемся получить полный путь. BrowseForFoldr = oItem.ParentFolder.ParseName(oItem.title).Path ' Обработка нажатия кнопки Cancel и выбора диска. If Err<> 0 Then If Err.Number = 424 Then ' Обработать кнопку Cancel. BrowseForFoldr ="-1" Else Err.Clear ' Обработать ситуацию, в которой пользователь выбирает диск. tmp = InStr(1, oItem.title, ":") If tmp > 0 Then ' Символ ":" найден; взять два символа и добавить \. BrowseForFoldr = Mid(oItem.Title, (tmp - 1), 2) & "\" End If End If End If Set oShell = Nothing Set oItem = Nothing On Error GoTo 0 End Function |
InputBox
Теперь давайте рассмотрим функцию InputBox, которая позволяет получить информации от пользователя. Стоит упомянуть, что функция InputBox поддерживается только языком VBScript. Давайте посмотрим на ее общий синтаксис:
result = InputBox(текст[, [заголовок], [умолчание], [поз-Х], [поз-У]])
Описание ключей таковы.
Текст — Необходимый параметр, определяющий сообщение, которое выводится в диалоговом окне.
Заголовок — Необязательный, определяющий текст заголовка диалогового окна.
Умолчание — Необязательный, задающий значение по умолчанию для текстового поля.
Поз-Х иПоз-У — Необязательные, определяющие положение верхнего левого угла диалогового окна.
Есть еще два необязательных ключа helpflle и context, с их помощью можно создавать встроенную справку, хотя, как правило, в данном контексте в этом нет необходимости.
Если необязательный ключ не задан, VBScript использует значение по умолчанию. Чтобы опустить необязательный параметр, надо оставить его место между двумя запятыми пустым:
InputBox("Привет", "Тест", , 100, 200) |
В отличие от MsgBox ключа для кнопки у функции InputBox нет. Результат, возвращаемый InputBox при закрытии, зависит от того, какая кнопка была нажата: ОК возвращает содержимое текстового поля (т. е. данные, введенные пользователем), a Cancel отменяет результаты ввода и возвращает пустую строку. Переменная result позволяет проверить, ввел ли человек действительную информацию.
' *********************************************************** ' InputBox.vbs ' Создание диалогового окна для получение вводимой информации на VBScript '**************************************************************** Option Explicit Dim Message, result Dim Title, Text1, Text2 ' Определить переменные диалоговых окон. Message = "Диалоговое окно на VBScript" Title = "Создание пользовательского диалогового окна " Text1 = "Было нажато на отмену" Text2 = "Вы ввели:" & vbCrLf ' Все готово для использования функции InputBox; result = InputBox(Message, Title, "Ввод данных", 100, 100) ' Обработать введенную информацию. If result = "" Then ' Отмена WScript.Echo Text1 Else WScript.Echo Text2 & result End If |
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 '********************************************************************** Option Explicit Dim Result result = MsgBox("Определяем, на что было нажато", vbOkCancel+ vbInformation, "Заголовок") If result = vbOK Then WScript.Echo "Нажата клавиша ОК" Else WScript.Echo "Нажата клавиша Отмена" End If |
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 ' ************************************************************* Option Explicit Dim Message, Title, result, WShell Message = "Нажмите на кнопку" 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 & ")" End if WScript.Echo "Выход из программы"