http://digilander.libero.it/Cenati

Accedere agli Appunti (clipboard)

home | e-mail e contatti | Introduzione al sito | Cosa e' e come imparare VbScript

 

 

 

 

 

Scrivere negli "appunti" di Windows o "clipboard"

Ricordo che fin dalla prima versione, Windows stupiva per la possibilità di ritagliare degli appunti da una applicazione per incollarli successivamente in un'altra.

Questa funzione è di grande utilità nell'attività di ogni giorno, ma per lungo tempo non ne ho avuto la necessità nella scrittura di script.

Qualche tempo fa mi è invece capitato di dover scrivere un programmino per comporre automaticamente dei testi che dovevano essere successivamente incollati in un programma che non supportava direttamente il colloquio con VbScript.

In particolare dovevo prendere dei dati da una riga di un foglio di Excel e comporre il testo di una lettera. Insomma, una specie di mailmerge, ma ogni lettera doveva essere incollata separatamente in un programma che non potevo raggiungere tramite lo script, anche per permettere all'utente un controllo sul risultato ed eventuali aggiunte.

VbScript non ha alcun comando per scrivere negli appunti, ma non è necessario acquistare un componente Active/x apposito, se avete almeno Internet Explorer oppure Word.

Scriviamo negli Appunti usando Internet Explorer

Il primo esempio che vi propongo è proprio con IE, che essendo presente su ogni installazione di Windows rispetta la mia politica di limitare al massimo l'insallazione di componenti aggiuntivi.

Il codice che vi mostro crea una istanza di IE che rimane invisibile. Crea al volo una pagina html e ci scrive dentro quello che l'utente vuole. Infine esegue due comandi di IE: seleziona tutto il testo contenuto nella finestra e attiva il comando "Copy". Come se lo si scegliesse dalla barra dei menu.

StrClipboard= inputbox("Questo testo sarà messo nella clipboard")
With CreateObject("InternetExplorer.Application")
  .Navigate "about:blank"
  'http://digilander.libero.it/Cenati
  do until .ReadyState = 4 : Wscript.Sleep 100 : Loop
  .visible = false
  With .document
    .writeln("<html><head><title></title></head><body><pre>")
    .writeln(StrClipboard)           
    .writeln("</pre></body></html>")
    .execcommand "SelectAll"
    .execcommand "Copy"
  end with ' document
end with 'Createobject

Il documento creato contiene il testo della variabile "StrClipboard" tra due tag "pre". Questo significa che il testo è preformattato, quindi mantiene i ritorni a capo tra le righe.

Potete quindi scrivere il vostro testo anche su più righe utilizzando il carattere speciale di VbScript che si chiama VbCrLf. Questo forza un ritorno a capo nella stringa (carriage return e line feed).

Per avere nella clipboard un testo composto da più righe puoi quindi scriverlo così:

strClipboard = "Riga uno " & vbcrlf
strClipboard = strClipboard & "Riga 2 " & vbcrlf

Il codice può anche essere trasformato in procedura, e diventerà così:

setClipboard("Apri notepad e scegli Modifica/Incolla")

sub SetClipboard(StrClipboard)
 With CreateObject("InternetExplorer.Application")
  .Navigate "about:blank"
  'http://digilander.libero.it/Cenati
  do until .ReadyState = 4 : Wscript.Sleep 100 : Loop
  .visible = false
  With .document
    .writeln("<html><head><title></title></head><body><pre>")
    .writeln(StrClipboard)           
    .writeln("</pre></body></html>")
    .execcommand "SelectAll"
    .execcommand "Copy"
  end with ' document
 end with 'Createobject
end sub

Anziché usare il tag "pre" si può giocare un po' con i font e creare un testo html complesso. La formattazione verrà mantenuta se il testo sarà incollato in un programma che la riconosce, come Word o Wordpad.

Inoltre, se al posto del testo ci mettete il link ad una immagine, la otterrete negli appunti e potrete incollarla dove volete. Anziché scrivere la riga con .writeln(StrClipboard) dovete scrivere qualcosa come

 .writeln("<img src" & chr(34) & "C:\Documenti\Immagini\abc.jpg" & chr(34) & ">") 

Ovviamente dovrete indicare la posizione del file con l'immagine che vi interessa. Notate che per ottenere il nome del file tra virgolette (all'interno del documento html) è necessario inserire il chr(34) che genera le virgolette, oppure la combinazione speciale "doppie virgolette".

E ora usiamo Word

Un secondo metodo per copiare qualcosa negli appunti è utilizzando Word. Spesso è fornito con Windows al momento dell'acquisto, magari nella suite ridotta (io ho Office 2000 sbe, senza Frontpage né Access).

Msg = " line 1 " & vbCrLf 
Msg = Msg & " LINE 2 " 
Set objWord = CreateObject("Word.Application") 
'http://digilander.libero.it/Cenati         
objWord.Visible = False 
With objWord
 .Documents.Add
 .Selection.TypeText Msg
 .Selection.WholeStory
 .Selection.Copy
 .Quit 0
End With

Questo codice esegue una istanza di MS Word, ci scrive il contenuto della variabile Msg, seleziona tutto il testo e lo copia.

Il funzionamento è analogo a quello illustrato con Internet Explorer. In entrambi i casi accadrà che la prima volta che viene chiamata questa funzione, il disco fisso lavorerà per qualche istante prima di continuare l'elaborazione. Questo accade perchè bisogna caricare IE o Word in memoria. La seconda volta che usate questa funzione all'interno del programma sarà molto più veloce, perchè in realtà al termine della procedura la memoria non viene scaricata e Word (o IE) rimane a disposizione per ulteriori istanze.

Usando Word c'è un limite di circa 11.000 caratteri che possono essere scritti negli appunti. Quando, usando normalmente il word processor, si copiano molti dati e si chiude Word, appare un messaggio che ci informa della grande mole di informazioni copiate. Word ci chiede se vogliamo mantenere questi dati negli appunti in modo che siano accessibili da altre applicazioni. Possiamo rispondere si oppure no.
Chiudendo word da uno script, questa domanda non viene posta e Word assume per default che non vogliamo occupare la Clipboard con tutti quei dati. Non viene sollevato alcun messaggio di errore, semplicemente negli appunti non troveremo nulla. Non ho trovato una soluzione a questo problema, ma è importante saperlo per escludere che il malfunzionamento riguardi lo script.

Leggere i dati presenti nella Clipboard

Il più è fatto... Scrivere negli Appunti di Windows non è facile, anche perchè il testo può essere più o meno formattato.

La lettura dei dati presenti nella clipboard ci offre meno possibilità di scelta. In VbScript possiamo solo recuperare stringhe di testo. Se vogliamo altri tipi di dati dovremo comunque incollarli in Word o in qualche altro programma per poterli utilizzare.

Anche nel caso della lettura degli appunti non troviamo alcuna istruzione nativa in VbScript. Bisogna quindi appoggiarsi a qualche altro programma, come ad esempio Internet Explorer. Anche questa volta ci viene in aiuto, per fini che non hanno nulla a che fare con la rete internet.

Lo spezzone di codice che segue crea un oggetto htmlfile e lo usa per accedere alla funzione GetData di Internet Explorer.

Set objHTML = CreateObject("htmlfile") 
strText = objHTML.ParentWindow.ClipboardData.GetData("text")
msgbox strText

oppure in modo più conciso si può anche scrivere

strText = CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text")
msgbox strText

A me questo metodo funziona senza problemi, ma potreste incontrare delle difficoltà se sono impostate delle restrizioni alla sicurezza di IE. Infatti pare che questo sistema funzioni solo se le impostazioni sono settate su sicurezza Media o Bassa.

In alternativa potrete utilizzare i metodi di Word (del Visual Basic for Application, quindi anche di Excel).

Ecco il codice, che non è molto diverso da quello mostrato per copiare i dati negli Appunti. In questo caso si crea un documento vuoto, si incolla il contenuto degli appunti, si seleziona tutto il testo e si legge in una variabile (strText) la selezione. Con Word invisibile l'utente non si accorge di nulla.

   Set objWord = CreateObject("Word.Application")
   objword.visible=false
   with objWord
    .Documents.add
    .Selection.Paste
    .Selection.WholeStory
    strText= .Selection
   end with

msgbox strText

Giovanni Cenati

 
 

© Cenati Giovanni 2004/2010 - http://digilander.libero.it/Cenati - Reventlov at Katamail com

home | e-mail e contatti | Introduzione al sito | Cosa e' e come imparare VbScript