Как создать диалог настроек с VbScript? - PullRequest
4 голосов
/ 29 мая 2009

У меня есть стороннее приложение, которое вызывает файл vsbscript для определенных операций. Я хотел бы создать приглашение для пользователя с выбором опций, выпадающим списком или флажком или чем-то подобным. Тем не менее, все, что я могу найти, это опция ввода.

Я не думаю, что HTA - это вариант в моем случае (если нет способа вызвать их из файла .vbs?)

Другая моя мысль была о каком-то элементе управления ActiveX, но я не могу найти встроенный, который был бы доступен по умолчанию в WindowsXP / Vista.

У кого-нибудь есть идеи, как мне этого добиться?

Ответы [ 7 ]

3 голосов
/ 01 июня 2009

Если вы хотите использовать hta для этого, это можно сделать следующим образом.
VBScript:


Set WshShell = CreateObject("WScript.Shell")
'Run the hta.
WshShell.Run "Test.hta", 1, true
'Display the results.
MsgBox "Return Value = " & getReturn
Set WshShell = Nothing

Function getReturn
'Read the registry entry created by the hta.
On Error Resume Next
     Set WshShell = CreateObject("WScript.Shell")
    getReturn = WshShell.RegRead("HKEY_CURRENT_USER\Volatile Environment\MsgResp")
    If ERR.Number  0 Then
        'If the value does not exist return -1
         getReturn = -1
    Else
        'Otherwise return the value in the registry & delete the temperary entry.
        WshShell.RegDelete "HKEY_CURRENT_USER\Volatile Environment\MsgResp"
    End if
    Set WshShell = Nothing
End Function

Затем спроектируйте hta по желанию и включите следующие методы



'Call this when the OK button is clicked.
Sub OK_Click
    For Each objradiobutton In Opt
         If objradiobutton.Checked Then
              WriteResponse objradiobutton.Value
        End If
    Next
    window.Close
End Sub

'Call this when the Cancel button is clicked.
Sub Cancel_Click
     WriteResponse("CANCEL")
     window.Close
End Sub

'Write the response to the registry
Sub WriteResponse(strValue)
    Set WshShell = CreateObject("WScript.Shell")
    WshShell.RegWrite "HKEY_CURRENT_USER\Volatile Environment\MsgResp", strValue
     Set WshShell = Nothing
End Sub

Я использовал группу переключателей с именем «Opt», чтобы сделать выбор, но вы можете использовать любые элементы управления, которые захотите.

Поскольку hta не может возвращать значения, это создаст запись в реестре температур. Если вам неудобно возиться с реестром, вы также можете записать результат в текстовый файл с темперией.

Этот подход хорош тем, что вы можете спроектировать hta любым удобным для вас способом, вместо того, чтобы использовать входящее в комплект поле ввода и выбирать числа (вот так DOS).

Это также может быть полезно, если вы расширили hta для создания себя на основе переданных ему аргументов, таких как передача заголовка, отображаемого сообщения, массива опций, набора кнопок. Таким образом, вы можете использовать тот же hta в любое время, когда вам нужно получить ввод от пользователя.

3 голосов
/ 24 апреля 2012

Вы можете использовать DialogLib для создания форм с выпадающими списками и флажками. DialogLib все еще находится на стадии разработки, но уже достаточно полезен: http://www.soren.schimkat.dk/Blog/?p=189

3 голосов
/ 29 мая 2009

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

Dim bullet
Dim response
bullet = Chr(10) & "   " & Chr(149) & " "
Do
    response = InputBox("Please enter the number that corresponds to your selection:" & Chr(10) & bullet & "1.) Apple" & bullet & "2.) Bannana" & bullet & "3.) Pear" & Chr(10), "Select Thing")
    If response = "" Then WScript.Quit  'Detect Cancel
    If IsNumeric(response) Then Exit Do 'Detect value response.
    MsgBox "You must enter a numeric value.", 48, "Invalid Entry"
Loop
MsgBox "The user chose :" & response, 64, "Yay!"
1 голос
/ 04 июня 2009

В качестве примера предложения @ TmDean есть класс, в котором я иногда использую сценарии IE (ну, это сценарий IE6; я не пробовал более поздние воплощения).

class IEDisplay
    '~ Based on original work by Tony Hinkle, tonyhinkle@yahoo.com

    private TEMPORARY_FOLDER

    private objShell
    private objIE
    private objFSO
    private objFolder
    private strName
    private streamOut
    private objDIV

    private numHeight
    private numWidth
    private numTop
    private numLeft

    private sub Class_Initialize()
    Dim strComputer
    Dim objWMIService
    Dim colItems
    Dim objItem
    Dim arrMonitors( 10, 1 )
    Dim numMonitorCount

    Set objShell = WScript.CreateObject("WScript.Shell")
    Set objIE = CreateObject("InternetExplorer.Application")

    strComputer = "."
    Set objWMIService = GetObject( "winmgmts:\\" & strComputer & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery( "Select  * from Win32_DesktopMonitor")

    numMonitorCount = 0 
    For Each objItem in colItems
        arrMonitors( numMonitorCount, 0 ) = objItem.ScreenHeight
        arrMonitors( numMonitorCount, 1 ) = objItem.ScreenWidth
        numMonitorCount = numMonitorCount + 1
    Next

    numHeight = arrMonitors( 0, 0 )
    numWidth = arrMonitors( 0, 1 )

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    TEMPORARY_FOLDER = 2
    set objFolder = objFSO.GetSpecialFolder( TEMPORARY_FOLDER )
    strName = objFSO.BuildPath( objFolder, objFSO.GetTempName ) & ".html"
    WriteFileU strName, Join( Array( "<HTML><HEAD><TITLE>Information</TITLE></HEAD>", _
                     "<BODY SCROLL='NO'><CENTER><FONT FACE='arial black'> <HR COLOR='BLACK'>", _
                     "<DIV id='MakeMeAnObject'></DIV>", _
                     "<HR COLOR='BLACK'></FONT></CENTER></BODY></HTML>" ), vbCRLF ), WF_CREATE        
    numTop = 0
    numLeft = 0
    end sub

    Sub Init( strPosition )
    'NW, N, NE, W, CENTRE, E, SW, S, SE
    Select Case strPosition
    Case "NW"
        numTop = 0
        numLeft = 0
    Case "N"
        numTop = 0
        numLeft = ( numWidth / 2 ) - 250
    Case "NE"
        numTop = 0
        numLeft = numWidth - 500
    Case "W"
        numTop = ( numHeight / 2 ) - 55
        numLeft = 0
    Case "CENTRE"
        numTop = ( numHeight / 2 ) - 55
        numLeft = ( numWidth / 2 ) - 250
    Case "E"
        numTop = ( numHeight / 2 ) - 55
        numLeft = numWidth - 500
    Case "SW"
        numTop = numHeight - 110
        numLeft = 0
    Case "S"
        numTop = numHeight - 110
        numLeft = ( numWidth / 2 ) - 250
    Case "SE"
        numTop = numHeight - 110
        numLeft = numWidth - 500
    Case Else
        numTop = 0
        numLeft = 0
    End Select

    SetupIE( strName )
    Set objDIV = objIE.Document.All("MakeMeAnObject")
    end sub

    private sub Class_Terminate()
    'Close IE and delete the file
    objIE.Quit
    '~ optionally you may want to get rid of the temp file
    end sub

    public sub Display( strMsg, numMillisec )
    objDIV.InnerHTML = strMsg
    WScript.Sleep numMillisec
    end sub

    Private Sub SetupIE(File2Load)
     objIE.Navigate File2Load
     objIE.ToolBar = False
     objIE.StatusBar = False
     objIE.Resizable = False

     Do
     Loop While objIE.Busy

     objIE.Width = 500
     objIE.Height = 110
     objIE.Left = numLeft
     objIE.Top = numTop
     objIE.Visible = True
     objShell.AppActivate("Microsoft Internet Explorer")
    End Sub

end class

здесь отсутствует (из оригинального сообщения) функция WriteFileU

Const WF_APPEND = 1
Const WF_CREATE = 2

Const WF_FOR_APPENDING = 8
Const WF_FOR_WRITING = 2
Const WF_CREATE_NONEXISTING = True

Const CONST_READ = 1, CONST_WRITE = 2, CONST_APPEND = 8

Const AS_SYSTEMDEFAULT = -2, AS_UNICODE = -1, AS_ASCII = 0

Sub WriteFileU( sFilename, sContents, nMode )
  Dim oStream
  If nMode = WF_APPEND Then
    Set oStream = oFSO.OpenTextFile( sFilename, WF_FOR_APPENDING, WF_CREATE_NONEXISTING, AS_UNICODE )
  ElseIf nMode = WF_CREATE Then
    Set oStream = oFSO.OpenTextFile( sFilename, WF_FOR_WRITING, WF_CREATE_NONEXISTING, AS_UNICODE )
  Else
    STOP
  End If

  oStream.Write sContents
  oStream.Close
  Set oStream = Nothing
End Sub

, а затем в качестве примера его использования

set i = new IEDisplay 
a = array("NW", "N", "NE", "W", "CENTRE", "E", "SW","S","SE")
for each aa in a
    i.init aa
    i.display "Here in " & aa & " of screen", 1000
next

Теперь это не сразу полезно (особенно там, где есть куча вызовов для моих собственных утилит), но это дает основу. Изменив, какой HTML хранится, вы можете добавить поддержку списков и т. Д.

1 голос
/ 29 мая 2009

Вы можете запустить HTA из VBScript.

Set shell = CreateObject("WScript.Shell")
shell.Run "Test.hta"

EDIT

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

1 голос
/ 29 мая 2009

Одним из вариантов является сценарий Internet Explorer. Вы можете использовать VBScript для запуска IE и загрузки локального HTML-файла, а также присоединить подпрограмму VBScript к кнопке отправки формы (или любым другим событиям JavaScript), которая затем может закрыть окно IE как часть его выполнения.

1 голос
/ 29 мая 2009

Попробуйте WshShell.Popup . В зависимости от ваших данных, которые могут работать на вас ...

В противном случае вы можете исследовать PowerShell.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...