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 :
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 : Ainsi, pour gérer l'action "OnClick" (appui sur le bouton) du
bouton "B1", on appellera la procédure correspondante : La variable "ready" (nom arbitraire) sert à codifier l'action opérée
par l'utilisateur : 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 :
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. |
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 : |
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
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 iciBIF_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 IfSi 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 FunctionTest 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![]()
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-444553540000ShellWSH :
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