bonjour,
la mésaventure (ancienne) d'un membre éminent senior du forum m'a donné envie
de faire le point complet sur un sujet banal mais pourtant très utile à savoir la manipulation du clipboard en vbscript
je n'évoquerai que les méthodes les plus performantes ce qui exclut d'emblée l'appel à l'objet "InternetExplorer.Application"
ou certains hacks utilisant mshta.exe comme environnement d'exécution
lecture du clipboard :
sClipValue = CreateObject("htmlfile").parentWindow.clipboardData.getData("Text")
la méthode est universelle et ne pose aucun problème ou restriction d'emploi
écriture dans le clipboard :
à l'origine, l'objet htmlfile autorisait l'écriture du clipboard sous WSH mais pour des raisons de sécurité,
MS a neutralisé les méthodes setData et clearData dans ce contexte d'exécution
peut-être pour compenser cette disparition, MS a fourni à partir de Windows Server 2003 un petit utilitaire
console Clip.exe qui permet d'alimenter le clipboard
cet utilitaire n'existe pas nativement sous XP mais il est facile de se procurer sur le net la version WS 2003 qui fonctionnera sans difficulté
le code rencontré le plus souvent sur le net est le suivant :
CreateObject("WScript.Shell").Run "cmd.exe /c echo " & sClipValue & "|clip",0,True
la méthode est rapide mais comporte des restrictions pratiquement jamais évoquées
1°- sClipValue ne doit pas contenir de caractères spéciaux de fin de ligne (vbCrLf, vbLf, VbCr)
2°- sClipValue sera placé dans le clipboard avec un CRLF additionnel généré par la commande echo
(ce sont ces deux restrictions confidentielles qui sont à l'origine des ennuis de notre membre éminent senior)
sous Windows la commande echo ne propose pas d'option pour éliminer ce CRLF indésirable et il
a été proposé par les plus imaginatifs ce code alternatif :
CreateObject("WScript.Shell").Run "cmd.exe /c <nul (set/p =""" & sClipValue & """)|clip",0,True
la méthode est plus lente mais résout la restriction n°2 tout en introduisant de nouvelles difficultés...
(le caractère = en début de chaine provoque une erreur de syntaxe, les espaces de début de chaine sont supprimés)
la gestion des caractères spéciaux s'avère néanmoins possible pour ces deux solutions moyennant un encodage préalable :
1 2 3
| CreateObject("WScript.Shell").Run "cmd.exe /c echo " & Escape(sClipValue) & "|clip",0,True
sClipValue = UnEscape(CreateObject("htmlfile").parentWindow.clipboardData.getData("Text"))
sClipValue = Left(sClipValue,Len(sClipValue)-2) ' suppression du CRLF final |
3°- limitation de la taille du contenu du clipboard à un peu moins de 8Ko
cette restriction qui correspond à la taille maximum de la ligne de commande gérée par cmd.exe est incontournable
c'est la raison pour laquelle j'ai écris une solution rapide et sans aucune restriction (caractères spéciaux, taille) pour écrire dans le clipboard
les puristes lui reprocheront sans doute un bref clignotement de fenêtre mais il existe
un hack pour pallier à cet éventuel problème (cf ma contrib sur le multi-thread)
CreateObject("WScript.Shell").Exec("clip.exe").StdIn.Write sClipValue
toute observation est la bienvenue avant insertion dans la
Partager