Création de formulaires de saisie à l'aide d'Internet Explorer

L'interface de VBScript/WSH est assez pauvre, n'offrant par défaut à l'utilisateur que 2 boites de dialogues, générées par les instructions

Nom Rôle Exemples
InputBox Permet la saisie d'une chaîne de caractères,et affiche un ou plusieurs boutons

MsgBox Affiche un ou plusieurs boutons

Si l'on veut saisir plusieurs champs simultanément, et/ou si l'on veut offrir des choix sous la forme de listes déroulantes, boutons radio, cases à cocher, ..., c'est impossible à réaliser avec ces deux fonctions.

On peut faire appel à un composant, sous la forme de contrôle ActiveX, mais c'est assez complexe, et surtout cela oblige à fournir le composant avec le script.

Etant donné que Internet Explorer est livré avec Windows, et que cette application est "pilotable" depuis un script VBS, on peut très bien l'utiliser pour réaliser des boites de dialogues.

Cela se réalise en deux étapes :

  1. Création du formulaire dans un document HTML (test.html)
    Voici un exemple commenté, qui utilise tous les types de champs que l'on peut trouver dans un formulaire :

    Code HTML Commentaires
    <html>
    <head>
    <title>Test de formulaire avec IE</title>
    </head>
    <body bgcolor="#FFFFD2" scroll="no">
    Entête traditionnel HTML (simplifié)
    <script language="VBScript">
    <!--
    Dim ready
    ' Action sur les boutons
    Sub B0_OnClick
    ready=-1
    End Sub

    Sub B1_OnClick
    ready=1
    End Sub

    Sub B2_OnClick
    ready=2
    End Sub

    ' Initialisation
    Sub Window_OnLoad()
    ready=0
    End Sub

    ' Fonction utilisable de l'extérieur pour tester l'envoi
    Public Function CheckVal()
    CheckVal=ready
    End function
    '-->
    </script>
    Script VBS de gestion des actions sur les boutons du formulaire

    Le nom de chaque fonction doit répondre à la règle suivante :
        <nom_du_bouton>_<action>

    Ainsi, pour gérer l'action "OnClick" (appui sur le bouton) du bouton "B1", on appellera la procédure correspondante :
       
    B1_OnClick

    La variable "ready" (nom arbitraire) sert à codifier l'action opérée par l'utilisateur :
    -1 pour le bouton B0 (annuler)
    1 pour le bouton B1 (Bouton 1)
    2 pour le bouton B2 (Bouton 2)

    La procédure Window_OnLoad (nom imposé) sert à effectuer des initialisations éventuelles (ici remise à zéro de la variable "ready")

    La fonction "Checkval" (nom arbitraire) sert à récupérer depuis le script VBS externe la valeur de la variable "ready". Elle sert à tester l'action sur un bouton.

    <form name="TestForm">
    <h3><center>Exemple de formulaire en VBS</center></h3><hr>
    Début du formulaire
    <select size="1" name="key">
    <option value="Opt1">Option 1</option>
    <option value="Opt2">Option 2</option>
    <option value="Opt3">Option 3</option>
    </select>
    Choix multiple sous la forme de liste déroulante
    Autre choix : <input type="text" size="10" name="autre"><br> Zone de saisie texte
    Case à cocher 1 : <input type="checkbox" name="case1" value="case 1" checked><br>
    Case à cocher 2 : <input type="checkbox" name="case2" value="case 2"><hr>
    Cases à cocher
    Choisir un fichier : <input type="file" size="60" name="fichier"><hr> Saisie de nom de fichier
    Texte sur plusieurs lignes :<br>
    <textarea cols="40" rows="5" name="texte"></textarea><hr>
    Saisie de texte sur plusieurs lignes
    Mot de passe : <input type="password" size="10" name="pwd"><hr> Saisie de mot de passe
    Cette méthode est : <br>
    <input type="radio" name="methode" value="géniale" checked>géniale<br>
    <input type="radio" name="methode" value="moyenne">moyenne<br>
    <input type="radio" name="methode" value="nulle">nulle<br>
    Boutons radio
    <hr>
    <input type="button" value="Bouton n° 1" name="B1">
    <input type="button" value="Bouton n° 2" name="B2">
    <input type="button" value="Annuler" name="B0">
    Boutons
    </form> Fin du formulaire
    </body>
    </html>
    Fin du document HTML

    Si on ouvre ce fichier avec Internet Explorer, on obtient ceci :


     

  2. Création du script dans un document VBS (test.vbs)

    Code VBS Commentaires
    Dim shell, oIE
    Set shell = WScript.CreateObject("WScript.Shell")
    Création d'une instance de l'objet Shell (en vue de l'appel de la fonction  AppActivate)
    Do While true
    Set oIE = WScript.CreateObject("InternetExplorer.Application", "IE_")
     
    Création d'une boucle sans fin, qui sera interrompue sur action extérieure.
    Création d'une instance de l'objet Internet Explorer (oIE)
    oIE.Left = 50
    oIE.Top = 100
    oIE.Height = 550
    oIE.Width = 550
    oIE.MenuBar = 0
    oIE.ToolBar = 0
    oIE.StatusBar = 0
    oIE.navigate GetPath() & "test.html"
    oIE.Visible = 2
    Définitions géométriques de la fenêtre

    Suppression des barres (menu, outils, état)

    Définition de l'URL à ouvrir.
    La fonction GetPath retourne le chemin du script VBS, qui est le même que celui du document HTML

    Do While (oIE.Busy)
    WScript.Sleep 200
    Loop
    Boucle de temporisation, le temps que la fenêtre de IE s'affiche.
    shell.AppActivate "Test de formulaire avec IE" Mise au 1er plan de la fenêtre d'IE.
    On utilise le titre défini dans la balise <Title> du document HTML
    On Error Resume Next
    Do
    WScript.Sleep 100
    Loop While (oIE.Document.Script.CheckVal() = 0)
    Interception des erreurs, p.ex. celle générée en cas de fermeture directe de la fenêtre d'IE.
    Test d'action sur un bouton du formulaire, à l'aide de la fonction
    CheckVal
    If Err <> 0 Then
    Wscript.Echo "On a fermé IE directement"
    Wscript.quit
    end if
    Si on ferme directement IE sans passer par un bouton, cela provoque une erreur qui est détectée et alors on quitte le script.
    test=oIE.Document.Script.CheckVal()
    If test=-1 Then
    CloseIE
    Wscript.Echo "On a appuyé sur Annuler"
    Wscript.quit
    end if
    Récupération du n° du bouton.
    Si sa valeur est égale à -1, c'est qu'on a appuyé sur Annuler. Dans ce cas, on ferme IE et on quitte le script.
    for index=0 to oIE.document.TestForm.methode.length-1
    if oIE.document.TestForm.methode(index).checked then
    exit for
    end if
    next
    Boucle permettant de récupérer l'index du bouton radio "methode" sélectionné.
    Wscript.Echo "On a appuyé sur le bouton " & test & VBCRLF & VBCRLF _
    & "On a choisi : " & oIE.Document.TestForm.options.value & _
    " et " & oIE.Document.TestForm.autre.value & VBCRLF _
    & "Case 1 : " & oIE.Document.TestForm.case1.Checked & VBCRLF _
    & "Case 2 : " & oIE.Document.TestForm.case2.Checked & VBCRLF _
    & "Fichier : " & oIE.Document.TestForm.fichier.value & VBCRLF _
    & "Texte : " & oIE.Document.TestForm.texte.value & VBCRLF _
    & "Mot de passe : " & oIE.Document.TestForm.pwd.value & VBCRLF _
    & "Méthode : " & oIE.document.TestForm.methode(index).value
    Affichage des résultats
    La récupération de chaque champ est de la forme :
    <objetIE>.Document.<nom_formulaire>.<nom_champ>.<valeur>

    Ici :
    <objetIE> = oIE
    <nom_formulaire> = TestForm
    <nom_champ> = options, case1, texte, pwd, ...
    <valeur> = value, Checked, ... (suivant le type de champ)

    CloseIE
    loop
    Fermeture d'IE
    Fin de la boucle sans fin initiale
    Function GetPath()
    Dim path
    path = WScript.ScriptFullName
    GetPath = Left(path, InStrRev(path, "\"))
    End Function
    Fonction de récupération du répertoire courant
    Sub CloseIE
    oIE.Quit
    Set oIE = Nothing
    End Sub
    Procédure de fermeture d'Internet Explorer

    L'exécution de ce script donne les résultats suivants :



     

    Si on a appuyé sur Annuler

    Si on a fermé directement la fenêtre de IE

     

Téléchargement des fichiers exemples cités ici :
ne pas cliquer directement (cela ouvrirait le fichier html) mais utiliser le menu contextuel "enregistrer la cible sous..."
 
test.vbs           test.html


Cette méthode de formulaire est utilisée dans le script setregedit.vbs

Utilisation de boite de dialogue de sélection de dossier

Comme cela a été indiqué plus haut, VBScript n'offre que 2 boites de dialogues assez sommaires (InputBox et MsgBox).
Or on peut avoir besoin de saisir un nom de dossier existant, à sélectionner dans les arborescences des partitions.

On ne peut pas faire appel à un formulaire comme décrit ci-dessus (en faisant appel à Internet Explorer, avec création de document HTML dans lequel figurera un champ <input type="file" ...>), car cette méthode ne permet que la sélection d'un fichier, et non pas d'un dossier.

On va utiliser une propriété de l'objet "shell" de Windows, qui s'appelle "BrowseForFolder". La boite de dialogue ainsi générée est créée par la bibliothèque "shdocvw.dll", fournie avec Internet Explorer à partir de la version 4.

ATTENTION! ne pas confondre avec l'objet "shell" de WSH!!!

Voici un exemple commenté :

Code VBS Commentaires
BIF_returnonlyfsdirs = &H0001 'uniquement les fichiers du système
BIF_dontgobelowdomain = &H0002
BIF_editbox = &H0010
BIF_validate = &H0020
BIF_browseforcomputer = &H1000
 
Constantes permettant de personnaliser le fonctionnement de BrowseForFolder
NB:
seules les valeurs pertinentes ont été indiquées ici
BIF_returnonlyfsdirs uniquement les fichiers et dossiers (exclut p.ex. le panneau de configuration)
BIF_dontgobelowdomain interdit d'explorer en dehors du domaine
BIF_editbox Affiche une zone d'édition
BIF_validate Vérifie la saisie dans la zone d'édition
BIF_browseforcomputer Autorise le parcours réseau
Dim shell, item
Set shell = WScript.CreateObject("Shell.Application")
Création d'une instance de de l'objet Shell de Windows
flag=BIF_returnonlyfsdirs
titre="Test de sélection de dossier"
Paramétrage
Set Item = shell.BrowseForFolder(0, title, flag, dirinit) Exécution de BrowseForFolder
1er paramètre toujours 0 (zéro). Il représente le handle de la fenêtre parent
2ème paramètre Titre de la boite, en dessous de la barre de titre

3ème paramètre

options de BrowseForFolder
4ème paramètre Facultatif. Répertoire de début d'exploration
If isvalue(Item) Then
Result=Item.Title
' Test si on a sélectionné la racine d'une partition
If InStr(1,Result,":")=0 Then
Result=Item.ParentFolder.ParseName(Item.Title).Path
End If
wscript.echo "On a choisi : " & Result
else
wscript.echo "On a appuyé sur Annuler"
End If
Si l'objet retourné est valide, on teste son contenu (item.title)

Si on a sélectionné la racine d'une partition, il se compose du nom de la partition, suivi de sa lettre et ":" entre parenthèses.

Sinon, il se compose du nom du dossier uniquement, sans le chemin précédent. On récupère ce chemin à l'aide des propriété et méthode ParentFolder.ParseName

Wscript.quit Fin du script
Function IsValue(obj)
Dim tmp
On Error Resume Next
tmp = " " & obj
If Err <> 0 Then IsValue = False Else IsValue = True
On Error GoTo 0
End Function
Test de validité de l'objet retourné par BrowseForFolder. Sert à déceler l'action sur Annuler ou la fermeture directe de la boite

NB: On ne peut pas utiliser "IsObject", qui retourne toujours "true"

L'exécution de ce script donne les résultats suivants :

Ou :
Sélection racine :

Sélection disque réseau :

Téléchargement du fichier exemple cité ici :
testdialog.vbs   

Accès au "shell" de Windows (fonctions multiples)

L'objet "shell" de Windows cité dans le paragraphe précédent permet d'accéder depuis un VBScript aux principales boites de dialogues de Windows.

Dim shell
Set shell = WScript.CreateObject("Shell.Application")
...

Fonctions Syntaxe
Explorateur de Windows  shell.explore <chemin>
Ouverture directe d'un dossier shell.Open "<dossier>"
Panneau de configuration shell.ControlPanelItem "<fichier.cpl>"
Réglage de l'heure shell.SetTime
Propriétés de la barre de tâches shell.TrayProperties
Recherche de fichiers shell.FindFiles
Recherche d'ordinateur shell.FindComputer
Exécution de programme shell.FileRun
Réduction de toutes les fenêtres shell.MinimizeAll
Mise en cascade de toutes les fenêtres shell.CascadeWindows
Fermeture de Windows shell.ShutdownWindows

Ces fonctions peuvent également être insérées dans un document HTML
(à ouvrir exclusivement avec Internet Explorer) :
Code HTML Commentaires
<HTML>
<HEAD>
<TITLE>Exploration de Windows</TITLE>

<OBJECT ID="ShellWindows"
CLASSID="clsid:13709620-C279-11CE-A49E-444553540000">
</OBJECT>

<OBJECT ID="ShellWSH"
CLASSID="clsid:72C24DD5-D70A-438B-8A42-98424B88AFB8">
</OBJECT>
Définition des objets ShellWindows et ShellWSH par leurs CLSID respectifs :

ShellWindows :
13709620-C279-11CE-A49E-444553540000

ShellWSH :
72C24DD5-D70A-438B-8A42-98424B88AFB8

<STYLE TYPE="text/css">
INPUT {width: 200}
body {
font-family: Verdana;
font-size: 10 pt }
h1, h2, h3, h4, h5, h6 { font-family: Verdana }
</STYLE>
Définition d'un style
<SCRIPT LANGUAGE="VBScript">
<!--
function fnStart(sMethod)
Dim fldrs
Set fldrs=ShellWSH.SpecialFolders
select case sMethod
case 0
ShellWindows.MinimizeAll
case 1
ShellWindows.FileRun
case 2
ShellWindows.ShutdownWindows
case 3
ShellWindows.FindFiles
case 4
ShellWindows.SetTime
case 5
ShellWindows.ControlPanelItem "INETCPL.cpl"
case 6
ShellWindows.Explore fldrs("MyDocuments")
case 7
ShellWindows.BrowseForFolder 0, "Mes Programmes", 0, fldrs("Programs")
case 8
ShellWindows.Open fldrs("Favorites")
case 9
ShellWindows.TrayProperties
end select
end function
-->
</SCRIPT>
Script VBS intégré

On fait appel à l'objet SpecialFolders du shell WSH pour récupérer les chemins de dossiers spéciaux tels que "Mes documents", "Program Files", "Favorites", ...

 

</HEAD>
<BODY bgcolor="#FFFFD2">
<H3>Exploration de Windows...</H3>
<INPUT type="button" value="Edition barre de tâches" onclick="fnStart(9)"><br>
<INPUT type="button" value="Dossier favoris" onclick="fnStart(8)"><br>
<INPUT type="button" value="Parcours de Program Files" onclick="fnStart(7)"><br>
<INPUT type="button" value="Exploration de Mes Documents" onclick="fnStart(6)"><br>
<INPUT type="button" value="Paramètres Internet" onclick="fnStart(5)"><br>
<INPUT type="button" value="Réglage de l'heure" onclick="fnStart(4)"><br>
<INPUT type="button" value="Recherche d'un fichier ou dossier" onclick="fnStart(3)"><br>
<INPUT type="button" value="Arrêt de Windows" onclick="fnStart(2)"><br>
<INPUT type="button" value="Exécution d'un programme" onclick="fnStart(1)"><br>
<INPUT type="button" value="Réduction de toutes les fenêtres" onclick="fnStart(0)">
</BODY>
</HTML>
Définition des boutons de commande

L'ouverture de ce document HTML donne le résultat suivant :


(action sur le bouton "Dossier Favoris")
En raison de la présence de Contrôle ActiveX,
des messages d'alerte sont affichés par Internet Explorer :

(appuyer sur Oui)


(appuyer sur Oui)

Téléchargement du fichier exemple cité ici :
ne pas cliquer directement (cela ouvrirait le fichier html) mais utiliser le menu contextuel "enregistrer la cible sous..."
testshell.html