Creating A Custom Dialog Using The Internet Explorer Object
A common need in scripting is the ability to create GUI interfaces
for user interaction, like gathering username and password data, or
displaying script output. While VBScript's MsgBox and InputBox let you
script certain simple interactions, you can create more sophisticated
dialogs using HTML code with the Internet Explorer (IE) object. This
tip walks you through building the dialog, displaying it, and handling
events in the dialog with full code samples.
Creating a custom dialog for use with SecureCRT scripts involves the
following steps:
- Building the GUI
- Displaying the GUI
- Handling UI Events
Building the GUI
Here is a screenshot of the custom dialog we will create:
The GUI interface for our custom dialog will be built using HTML code
displayed through Internet Explorer. There are two ways to store the
HTML code.
- Creating an HTML file with the HTML code, or
- Dynamically specifying the HTML code within script code
Our example will use the second method of dynamically specifying the
HTML code within the script code. Below is an example of what this code
might look like in the SecureCRT script for a dialog that displays fields
for entering username and password, and contains OK and Cancel
buttons:
szHTMLBody = _
"<font color='red'><b>Specify
username and password:</b></font>" & _
"<hr>" & _
"<b><u>U</u>sername:</b>"
& _
"<input name='Username' size='40'
maxlength='512' AccessKey='u'>" & _
"<br>" & _
"<b><u>P</u>assword:</b>"
& _
"<input type=password name='Password'
size='40' maxlength='512' AccessKey='p'>" & _
"<hr>" & _
"<button name='OK' AccessKey='O'><u>O</u>K</button>"
& _
" "
& _
"<button name='Cancel' AccessKey='C'><u>C</u>ancel</button>"
Displaying the GUI
Displaying the GUI is accomplished by performing the following tasks:
- Get a reference to the InternetExplorer.Application object
- Inject the HTML GUI code associated with the controls in our custom
dialog
- Configure display properties of the IE window, and bring the window
into view
Here is example code that performs these three steps:
' Get a reference to IE's Application object
Set g_objIE = CreateObject("InternetExplorer.Application")
g_objIE.Offline = True
g_objIE.navigate "about:blank"
' This loop is required to allow the IE object to
finish loading...
Do
crt.Sleep 100
Loop While g_objIE.Busy
g_objIE.Document.body.Style.FontFamily = "Sans-Serif"
szHTMLBody = _
"<font color='red'><b>Specify
username and password:</b></font>" & _
"<hr>" & _
"<b><u>U</u>sername:</b>"
& _
"<input name='Username' size='40'
maxlength='512' AccessKey='u'>" & _
"<br>" & _
"<b><u>P</u>assword:</b>"
& _
"<input type=password name='Password'
size='40' maxlength='512' AccessKey='p'>" & _
"<hr>" & _
"<button name='OK' AccessKey='O'><u>O</u>K</button>"
& _
" "
& _
"<button name='Cancel' AccessKey='C'><u>C</u>ancel</button>"
' Inject the HTML code above into the IE object
g_objIE.Document.Body.innerHTML = szHTMLBody
' Prevent the MenuBar, StatusBar, AddressBar, and
Toolbar from
' being displayed as part of the IE window
g_objIE.MenuBar = False
g_objIE.StatusBar = False
g_objIE.AddressBar = False
g_objIE.Toolbar = False
' Set the initial size of the IE window
g_objIE.height = 200
g_objIE.width = 425
' Set the title of the IE window
g_objIE.document.Title = "Authentication Credentials Prompt"
g_objIE.Visible = True
' This loop is required to allow the IE window to
fully display
' before moving on
Do
crt.Sleep 100
Loop While g_objIE.Busy
' This code brings the IE window to the foreground.
Set objShell = CreateObject("WScript.Shell")
objShell.AppActivate g_objIE.document.Title
' Once the dialog is displayed and has been brought
to the
' foreground, set focus on the control of our choice...
g_objIE.Document.All("Username").Focus
Handling UI Events
There are four main components of an event handler for our custom dialog
using IE:
- A hidden variable in the HTML code (ButtonHandler in
our example below)
- Setting up OnClick actions for each
button in the dialog that sets the ButtonHandler value
to reflect the name of the button that was pressed
- A Do loop that waits for any change
in the ButtonHandler variable
- A Select Case code block that handles
each button press event
The Hidden ButtonHandler Variable
This variable is included in the HTML code and is updated every time
something important happens, such as the user clicking OK
or Cancel. The following HTML code for the OK
and Cancel buttons sets the value of our hidden ButtonHandler
variable appropriately:
<button name='OK' AccessKey='O' Onclick=document.all('ButtonHandler').value='OK';><u>O</u>K
</button>
and
<button name='Cancel' AccessKey='c' Onclick=document.all('ButtonHandler').value='Cancel';><u>C</u>ancel</button>
The following code creates the ButtonHandler
variable and sets its initial value to "Nothing Clicked Yet"
as an explicit indication that no buttons have been pressed yet:
<input name='ButtonHandler' type='hidden' value='Nothing
Clicked Yet'>
The Do Loop
The Do loop is used in the SecureCRT
script to continue looping while checking the value of the ButtonHandler variable.
In the event that the IE window is closed by means other than the Cancel
button, this will be handled as well.
The Select Case
The Select Case, contained in the Do
loop, is used to act on the different inputs received from the user
inside custom dialog. Since the Do loop
does not include a While statement that
would inherently exit the loop should a certain clause be met, code
to exit the loop will need to be included in the Select
Case.
An example of the complete Do loop with
the embedded Select Case is below:
Do
' If the user closes the IE window by Alt+F4
or clicking on the 'X'
' button, we'll detect that here, and exit
the script if necessary.
On Error Resume Next
Err.Clear
szNothing = g_objIE.Document.All("ButtonHandler").Value
if Err.Number <>
0 then exit do
On Error Goto 0
' Check to see which buttons have been clicked,
and address each one
' as it's clicked.
Select Case g_objIE.Document.All("ButtonHandler").Value
Case "Cancel"
'
The user clicked Cancel. Exit the loop
g_objIE.quit
Exit
Do
Case "OK"
'
The user clicked OK. Act on the information in the
'
Username and Password fields
'
Capture data from each field in the dialog...
szUsername
= g_objIE.Document.All("Username").Value
szPassword
= g_objIE.Document.All("Password").Value
g_objIE.quit
'
Now that we have closed the IE dialog, we can act on our data
MsgBox
"Here is the information you entered..." & vbcrlf &
vbtab & _
"Username:
" & szUsername & vbcrlf & vbtab & _
"Password:
" & szPassword
Exit
Do
End Select
' Wait for user interaction
with the dialog...
crt.Sleep 200
Loop
The Final Product
The complete SecureCRT script for the custom dialog can be downloaded
here.
If you have any questions about using the IE object to create custom
dialogs, or other scripting questions, contact VanDyke
Software Support.
Tell us what you think. Did you find this tip useful? Do you have a question you'd like us to answer? Send your comments and questions to VanDyke Software Support.
| Four Fast Ways to Learn More... |
| 1. Read
or download one of our secure solutions white
papers. |
2. Download
a free
30-day evaluation copy of
our products. |
3. Let
us help
define the right Secure Shell solution for your company. |
4. Subscribe
to our monthly newsletter for
tips, solutions ideas, and product news. |
|