1. #1
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    février 2006
    Messages
    1 112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 1 112
    Points : 2 962
    Points
    2 962

    Par défaut [FAQ] Accès au presse-papier - the ultimate clipboard code

    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    - sClipValue ne doit pas contenir de caractères spéciaux de fin de ligne (vbCrLf, vbLf, VbCr)
    - 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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    - 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)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CreateObject("WScript.Shell").Exec("clip.exe").StdIn.Write sClipValue
    toute observation est la bienvenue avant insertion dans la
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  2. #2
    Membre chevronné

    Homme Profil pro
    Responsable déploiement (SCCM, AirWatch, AMP)
    Inscrit en
    juillet 2014
    Messages
    1 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, AirWatch, AMP)
    Secteur : Transports

    Informations forums :
    Inscription : juillet 2014
    Messages : 1 098
    Points : 2 046
    Points
    2 046

    Par défaut

    Le clignotement d'une fenêtre console m'est devenu insupportable, peux tu proposer un code sans cela ?
    Peux tu aussi proposer une méthode Get basé sur le même principe afin de rester homogène sur la technologie utilisée ?

    PS : Je suis bien étonné que wmi ne permet pas d'accéder (Read, Write) au presse-papier

    Merci

  3. #3
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    février 2006
    Messages
    1 112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 1 112
    Points : 2 962
    Points
    2 962

    Par défaut

    Le clignotement d'une fenêtre console m'est devenu insupportable, peux tu proposer un code sans cela ?
    avec gestion des paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ' pas de code exécuté avant cette ligne
    Set oShell = CreateObject("WScript.Shell")
    If InStr(1,WScript.FullName,"WScript.exe",vbTextCompare) > 0 Then
    For Each Arg In WScript.Arguments
      If InStr( Arg, " " ) Then Arg = """" & Arg & """"
        sArgs = sArgs & " " & Arg
      Next
      oShell.Run "cscript.exe """ & WScript.ScriptFullName & """ " & sArgs,0,False
      WScript.Quit 
    End If
    sClipValue="Hello world"
    oShell.Exec("clip.exe").StdIn.Write sClipValue
    MsgBox WScript.Arguments.Count
    Peux tu aussi proposer une méthode Get basé sur le même principe afin de rester homogène sur la technologie utilisée ?
    impossible avec l'utilitaire MS qui ne gère que l'écriture (stdIn) et pas la lecture (stdOut)
    pour respecter la symétrie, il faut utiliser un utilitaire console capable de gérer les deux flux (sur github ça ne manque pas)

    Je suis bien étonné que wmi ne permet pas d'accéder (Read, Write) au presse-papier
    c'est pour notre bien certainement
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  4. #4
    Membre chevronné

    Homme Profil pro
    Responsable déploiement (SCCM, AirWatch, AMP)
    Inscrit en
    juillet 2014
    Messages
    1 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, AirWatch, AMP)
    Secteur : Transports

    Informations forums :
    Inscription : juillet 2014
    Messages : 1 098
    Points : 2 046
    Points
    2 046

    Par défaut

    Merci.

    Quand je vois cela je me demande si un outil tiers qui gère le read et write ne serait pas plus simple ... propre ?
    Je parle d'un outil non console, invisible sans astuce.

    Qu'en penses tu ?

  5. #5
    Membre chevronné

    Homme Profil pro
    Responsable déploiement (SCCM, AirWatch, AMP)
    Inscrit en
    juillet 2014
    Messages
    1 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, AirWatch, AMP)
    Secteur : Transports

    Informations forums :
    Inscription : juillet 2014
    Messages : 1 098
    Points : 2 046
    Points
    2 046

    Par défaut

    Sinon PowerShell fait les deux ... avec ses contraintes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    powershell -sta "add-type -as System.Windows.Forms; [windows.forms.clipboard]::GetText()"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    powershell -sta "add-type -as System.Windows.Forms; [windows.forms.clipboard]::SetText('toto')"

  6. #6
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    février 2006
    Messages
    1 112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 1 112
    Points : 2 962
    Points
    2 962

    Par défaut

    Quand je vois cela je me demande si un outil tiers qui gère le read et write ne serait pas plus simple ... propre ?
    Je parle d'un outil non console, invisible sans astuce.
    pour gérer les e/s standards l'appli win32 devra avoir une console mais c'est possible effectivement.
    perso je n'en connais pas

    Sinon PowerShell fait les deux ... avec ses contraintes.
    certes mais c'est un autre sous-forum...
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

Discussions similaires

  1. [FAQ] Copier du texte dans le presse papier (Clipboard)
    Par ABOAT dans le forum Vos Contributions VBScript
    Réponses: 0
    Dernier message: 18/12/2015, 21h56
  2. Réponses: 1
    Dernier message: 11/02/2013, 20h06
  3. Exécution d'un code de la faq sur le Presse papier
    Par flet le kid dans le forum VBA Access
    Réponses: 10
    Dernier message: 29/06/2009, 12h06
  4. Réponses: 4
    Dernier message: 18/05/2006, 12h07
  5. Réponses: 4
    Dernier message: 28/10/2005, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo