para - ¿Cómo crear diálogo de opciones con VbScript?
vbscript descargar (7)
Pruebe WshShell.Popup . Dependiendo de sus datos que pueden funcionar para usted ...
De lo contrario, podría investigar PowerShell.
Tengo una aplicación de terceros que invoca un archivo vsbscript para ciertas operaciones. Me gustaría poner un aviso del usuario con una opción de opciones, ya sea una lista desplegable o casilla de verificación o algo así. Sin embargo, todo lo que puedo encontrar es la opción del cuadro de entrada.
No creo que las HTA sean una opción en mi caso (a menos que haya una forma de llamarlas desde un archivo .vbs).
Mi otro pensamiento era algún tipo de control ActiveX, pero no puedo encontrar uno integrado que estaría disponible de forma predeterminada en Windows XP / Vista.
¿Alguien tiene alguna idea sobre cómo podría lograr esto?
La respuesta simple es, realmente no puedes. La solución de Tmdean es la única forma en que puedo pensar. Dicho eso, puedes arreglar el cuadro de entrada para que no se vea horrible . Dale una carrera, no creo que sea un fracaso épico :
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!"
Una opción es guiar Internet Explorer. Puede utilizar VBScript para iniciar IE y cargar un archivo HTML local, y adjuntar un sub archivo de VBScript al botón de envío de un formulario (o cualquier otro evento de JavaScript), que luego puede cerrar la ventana de IE como parte de su ejecución.
Puede iniciar una HTA desde un VBScript.
Set shell = CreateObject("WScript.Shell")
shell.Run "Test.hta"
EDITAR
Como tiene el control total de VBScript, ¿podría hacer que VBScript de terceros simplemente llame a su HTA? Podría colocar la IU y cualquier código de procesamiento dentro de la HTA.
Si desea utilizar un hta para esto, puede hacerlo así.
El 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
A continuación, diseñe el hta como desee e incluya los siguientes métodos
''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
Utilicé un grupo de botones de opción llamados "Optar" para elegir, pero puede usar los controles que desee.
Debido a que hta no puede devolver valores, esto creará una entrada de registro temperary. Si no eres compatible con el registro, también puedes escribir el resultado en un archivo de texto temperary.
Este enfoque es bueno porque puede diseñar el hta de la manera que desee, en lugar de usar la casilla de entrada suministrada y elegir números (eso es DOS).
Esto también podría ser bueno si expandió hta para crearse a sí mismo en función de los argumentos que se le pasaron, como pasar un título, un mensaje para mostrar, una matriz de opciones, un conjunto de botones. De esta forma, podría usar el mismo hta en cualquier momento que necesite obtener información del usuario.
Puede usar DialogLib para crear formularios con listas desplegables y casillas de verificación. DialogLib todavía está en sus etapas iniciales, pero ya es bastante útil: http://www.soren.schimkat.dk/Blog/?p=189
Como ejemplo de la sugerencia de @TmDean, hay esta clase que a veces uso qué secuencias de comandos IE (bueno, el IE6 con guiones, no he probado las encarnaciones más recientes).
class IEDisplay
''~ Based on original work by Tony Hinkle, [email protected]
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
aquí está la función faltante (de la publicación original) 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
y luego como un ejemplo de su uso
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
Ahora eso no es inmediatamente útil (especialmente si hay un montón de llamadas a mis propias rutinas de utilidad allí) pero da un marco. Al modificar qué HTML se almacena, puede agregar soporte para listboxes, etc.