Introduzione:
In questo articolo vedremo come creare uno smart tag per office 2003 in Visual Basic.Net 2003, tale smart tag avrà il compito di Visualizzare un sito o un inviare un email qualora su un documento Word viene scritta la parola Emanuele, come mostrato in figura 1 (se avete problemi nella visualizzazione delle immagini, andate nella categoria immagini, sezione smart tag vb.net)
Figura 1
La creazione di uno smarttag, comporta la creazione di due classi una chiamata Recognizer che avrà il compito di impostare le informazioni dello smart tag (nome, descrizione, ecc) e una chiamata Action che avrà il compito di eseguire determinate operazione (nel nostro caso aprire un sito o inviare un email).
Creazione di un progetto.
Avviamo Visual studio net 2003, si scelga nuovo progetto, nella finestra che viene aperta (figura 2) scegliamo come tipo di progetto (parte sinistra) Progetti di Visual basic, e nella parte modelli (parte di destra) libreria di classi, digitiamo un nome e scegliamo ok.

Figura 2 - http://www.blogema.altervista.org/smarttagvbnet2.jpg
Importazione
Verrà creata automatica una classe che si chiama class1.vb.
Rinominiamo sia il file che la classe con il seguente nome: Recognizer ed il nome del file Recognizer.vb.
A questo punto dobbiamo importare il riferimento smart tag versione 2.0, come mostrato nella figura successiva (figura 3)
Figura 3 - http://www.blogema.altervista.org/smarttagvbnet3.jpg
Per importare un riferimento in Visual Basic Net, bisogna selezionare la voce di menu Aggiungi riferimento, situato in progetti. Si aprirà una finestra, in essa scegliamo la voce Com, e selezioniamo la voce Microsoft Smart Tags 2.0 (office 2003, mentre 1.0 è per la versione office Xp).
Fatto ciò facciamo click sul pulsante seleziona e poi ok.
Stesura del codice
Dobbiamo importare due namespace, uno per la gestione dei smart tag e l’altro per la gestione dei file interoperabilità.
quindi in alto sopra della dicitura class scriviamo il seguente codice.
Imports Microsoft.Office.Interop.SmartTag
Imports System.Runtime.InteropServices
Fatto ciò bisogna creare un codice guid, esso ci permette di dare un riferimento alla dll che andremo a creare nel registro di sistema di windows.
Per assegnare un valore guid, bisogna fare click sulla voce di menù crea guid, situato in strumenti e nella finestra (figura 4) che viene aperta selezioniamo la quarta opzione ossia registry format facciamo click sul pulsante copia e poi sul pulsante esci.

Figura 4 - http://www.blogema.altervista.org/smarttagvbnet4.jpg
Il codice guid va messo nella classe guidattributes.
Come mostrato qui di seguito:
manuele.Recognizer"), _
GuidAttribute("5CFC6CE8-6A70-4b68-9500-8480DBA013DA"), _
ComVisible(True)> _
Public Class Recognizer
La classe deve implementare l’interfaccia ismarttagrecognizer, di seguito è riportato il codice di tale operazione.
Implements ISmartTagRecognizer
quando si digita il pulsante invio dopo la parola ismarttagrecognizer, verranno scritte in automatico alcune proprietà.
Le proprietà di Recognizer
Analizziamo qui di seguito le varie proprietà ed il metodo recognizer della classe recognizer.
Proprietà Desc
Ha il compito di dare una descrizione alla classe Recognizer
Public ReadOnly Property Desc(ByVal LocaleID As Integer) As String Implements Microsoft.Office.Interop.SmartTag.ISmartTagRecognizer.Desc
Get
'descrizione della classe recognizer
Return "Descrizione Recognizer"
End Get
End Property
Proprietà Name:
Questa proprietà ha il compito di visualizzare il nome nell’elenco degli smarttag (figura 5) situati alla pagina smart tag, della finestra che viene aperta facendo click sulla voce di menu opzioni di correzione automatica in strumenti di Word

Figura 5
Public ReadOnly Property Name(ByVal LocaleID As Integer) As String Implements Microsoft.Office.Interop.SmartTag.ISmartTagRecognizer.Name
Get
'nome dello smart tag che verrà visualizzata nella finestra dei smart tag
Return "Smart tag di Esempio"
End Get
End Property
Proprietà ProgId:
Questa proprietà ritorna il valore id della classe Recognizer:
Public ReadOnly Property ProgId() As String Implements Microsoft.Office.Interop.SmartTag.ISmartTagRecognizer.ProgId
Get
'ritorna il valore dell id della classe di Recognizer
Return "SmartTagEmanuele.Recognizer"
End Get
End Property
Metodo Recognize:
Questo metodo ha il compito di ricercare nel documento la parola “emanuele” se viene trovata visualizza sotto la medesima parola una sottolineatura di colore viola che posizionando il mouse in prossimità visualizzerà l’icona dei smart Tag.
Public Sub Recognize(ByVal Text As String, ByVal DataType As Microsoft.Office.Interop.SmartTag.IF_TYPE, ByVal LocaleID As Integer, ByVal RecognizerSite As Microsoft.Office.Interop.SmartTag.ISmartTagRecognizerSite) Implements Microsoft.Office.Interop.SmartTag.ISmartTagRecognizer.Recognize
'gestisco gli eventuali errori
Try
'verifico che il testo esista
Dim IntPosizione As Integer
IntPosizione = InStr(Text, "Emanuele", CompareMethod.Text) 'Text.IndexOf("Ema") '
If IntPosizione > 0 Then
'creo un property bag
Dim propbag As Microsoft.Office.Interop.SmartTag.ISmartTagProperties
propbag = RecognizerSite.GetNewPropertyBag
Dim StrTipoProperty As String
Select Case DataType
Case IF_TYPE.IF_TYPE_CELL
StrTipoProperty = "IF_TYPE_CELL"
Case IF_TYPE.IF_TYPE_CHAR
StrTipoProperty = "IF_TYPE_CHAR"
Case IF_TYPE.IF_TYPE_PARA
StrTipoProperty = "IF_TYPE_PARA"
Case IF_TYPE.IF_TYPE_REGEXP
StrTipoProperty = "IF_TYPE_REGEXP"
Case IF_TYPE.IF_TYPE_SINGLE_WD
StrTipoProperty = "IF_TYPE_SINGLE_WD"
End Select
propbag.Write("DataType", StrTipoProperty)
'aggiongo il testo alla funzione testo
propbag.Write("Text", Text)
'aggiungo l'id
propbag.Write("LocaleID", LocaleID.ToString())
RecognizerSite.CommitSmartTag("urn:esempio-smarttag#SmartTagEmanuele", IntPosizione + 1, 8, propbag)
End If
Catch ex As Exception
EventLog.WriteEntry("SmartTag", ex.Message, EventLogEntryType.Error)
End Try
End Sub
Di seguito verrà spiegata tale procedura.
Il metodo instr restituisce un numero, che corrisponde alla posizione della parola che vogliamo cercare.
L’oggetto propbag ha il compito di gestire lo smart tag, nell’esempio viene creato tramite il metodo GetNewPropertyBag della classe RecognizerSite.
Il metodo CommitSmartTag dell’oggetto RecognizerSite ha il compito di visualizzare tale tag, questo metodo accetta 4 argomenti, il nome del tag, l’inizio da dove iniziare la sottolineatura e la lunghezza di tale sottolineatura, ed il tag. Da notare che il promi argomento, ossia il nome dello smart tag, è il nome impostato nella proprietà smartTagName.
Proprietà SmartTagCount:
Questa proprietà ritorna il numero dei smart tag (nel nostro caso uno)
Public ReadOnly Property SmartTagCount() As Integer Implements Microsoft.Office.Interop.SmartTag.ISmartTagRecognizer.SmartTagCount
Get
Return 1
End Get
End Property
Proprietà SmartTagDownloadURl
Questa proprietà ha il compito di ritornare un possibile url
Public ReadOnly Property SmartTagDownloadURL(ByVal SmartTagID As Integer) As String Implements Microsoft.Office.Interop.SmartTag.ISmartTagRecognizer.SmartTagDownloadURL
Get
'url dello smart tag
Return ""
End Get
End Property
Proprietà SmartTAgName:
Questa proprietà imposta (restituisce) il nome per ogni singolo smart tag da notare che il nome dopo il cancellato è quello del progetto.
Public ReadOnly Property SmartTagName(ByVal SmartTagID As Integer) As String Implements Microsoft.Office.Interop.SmartTag.ISmartTagRecognizer.SmartTagName
Get
'nome dello smart tag
Return "urn:esempio-smarttag#SmartTagEmanuele"
End Get
End Property
Inserimento della classe Action:
La classe Action permette di eseguire la varie azioni dello smart tag. Quindi dobbiamo inserire una nuova classe, quindi facciamo click con il pulsante destro del mouse, sul nome del progetto, e selezioniamo la voce nuova classe. Come nome gli assegniamo il valore Action.
Anche in questa classe bisogna importare il namespace smart tag e interoperabilità.
Quindi in alto sopra ad ogni scritta scriviamo il seguente codice:
Imports System.Runtime.InteropServices
Imports Microsoft.Office.Interop.SmartTag
Anche per questa classe dobbiamo assegnare una guid, come visto in precedenza per la classe recognizer, quindi la procedura sarà la medisima
Il codice dev’essere simile quello riportato qui di seguito.
manuele.Action"), _
GuidAttribute("0C832FB2-717D-443f-AD90-DBFE42072FFE"), _
ComVisible(True)> _
Public Class Action
La classe Action, deve implementare l’interfaccia ISmartTagAction
quindi scriveremo sotto a class Action il seguente codice:
Public Class Action
Implements ISmartTagAction
Anche qui dopo la scritta ismarttagaction digitando il pulsante della tastiera invio verranno automaticamente riportale le varie prorpietà e metodi di tale interfaccia.
Proprietà Desc:
Questa proprietà ha il compito di impostare la descrizione della classe action.
Public ReadOnly Property Desc(ByVal LocaleID As Integer) As String Implements Microsoft.Office.Interop.SmartTag.ISmartTagAction.Desc
Get
'descrizione della classe action
Return "Descrizione della classe action"
End Get
End Property
Metodo invokeverb
Tale metodo ha il compito di eseguire l’azione sulle varie voci che vengono visualizzati durante l’apertura dello smart tag (figura 1), per esempio se noi abbiamo due voci una con la scritta email e l’altra con la scritta sito, a seconda della voce che verrà selezionata eseguirà una determinata azione.
Public Sub InvokeVerb(ByVal VerbID As Integer, ByVal ApplicationName As String, ByVal Target As Object, ByVal Properties As Microsoft.Office.Interop.SmartTag.ISmartTagProperties, ByVal Text As String, ByVal Xml As String) Implements Microsoft.Office.Interop.SmartTag.ISmartTagAction.InvokeVerb
'verifico che voce è stata selezionata
Select Case VerbID
Case 1 'email
System.Diagnostics.Process.Start("mailto:emanuelemattei@aruba.it")
Case 2 'sito
System.Diagnostics.Process.Start("http://www.shareoffice.it")
End Select
End Sub
La proprietà name
imposta il nome per la classe action.
Public ReadOnly Property Name(ByVal LocaleID As Integer) As String Implements Microsoft.Office.Interop.SmartTag.ISmartTagAction.Name
Get
'imposto il nome per la classe action
Return "Nome Action"
End Get
End Property
Proprietà ProgId
Questa proprietà imposta l’id della classe action da notare che tale id è il nome della classe preceduto dal nome del progetto.
Public ReadOnly Property ProgId() As String Implements Microsoft.Office.Interop.SmartTag.ISmartTagAction.ProgId
Get
'ritorna l'id della classe action
Return "SmartTagEmanuele.Action"
End Get
End Property
La proprietà SmartTagCaption:
Questa proprietà ha il compito di visualizzare una descrizione nella finestra dei smart tag(figura 5), questo testo precede il nome di tale smart tag.
Public ReadOnly Property SmartTagCaption(ByVal SmartTagID As Integer, ByVal LocaleID As Integer) As String Implements Microsoft.Office.Interop.SmartTag.ISmartTagAction.SmartTagCaption
Get
'il valore che verrà visualizzato nella finestra smart tag
Return "Esempio di smartTag"
End Get
End Property
La proprietà smarttagcount
Questa proprietà ha il compito di indicare il numero dei smart tag. Nel nostro caso uno
Public ReadOnly Property SmartTagCount() As Integer Implements Microsoft.Office.Interop.SmartTag.ISmartTagAction.SmartTagCount
Get
' il numero dei smart tag
Return 1
End Get
End Property
La proprietà SmartTagName
Questa proprietà ha il compito di visualizzare il nome dello smart tag.
Public ReadOnly Property SmartTagName(ByVal SmartTagID As Integer) As String Implements Microsoft.Office.Interop.SmartTag.ISmartTagAction.SmartTagName
Get
'il nome dello smart tag che si vuole eseguire.
Return "urn:esempio-smarttag#SmartTagEmanuele"
End Get
End Property
La proprietà VerbCaptionFromId
Questa proprietà ha il compito di visualizzare le varie voci dello smart tag.
Tramite l’argomento VerbId indica il numero di indice di tali voci.
Public ReadOnly Property VerbCaptionFromID(ByVal VerbID As Integer, ByVal ApplicationName As String, ByVal LocaleID As Integer) As String Implements Microsoft.Office.Interop.SmartTag.ISmartTagAction.VerbCaptionFromID
Get
Select Case VerbID
Case 1 'visualizza il testo delle due caption
Return "Email"
Case 2
Return "Sito"
End Select
End Get
End Property
La proprietà VerbCount
Essa ritorna il numero delle voci.
Public ReadOnly Property VerbCount(ByVal SmartTagName As String) As Integer Implements Microsoft.Office.Interop.SmartTag.ISmartTagAction.VerbCount
Get
'ritorna il numero delle voci
If (SmartTagName.Equals("urn:esempio-smarttag#SmartTagEmanuele")) Then
Return 2
End If
End Get
End Property
La proprietà VerbId
Questa proprietà ritorna l’indice della voce selezionata
Public ReadOnly Property VerbID(ByVal SmartTagName As String, ByVal VerbIndex As Integer) As Integer Implements Microsoft.Office.Interop.SmartTag.ISmartTagAction.VerbID
Get
'ritorna l'indice della voce
Return VerbIndex
End Get
End Property
La proprietà VerbNameFromid
Questa proprietà ha il compito di assegnare ad ogni singolo indice (voce di menu) un nome indentificativo.
Public ReadOnly Property VerbNameFromID(ByVal VerbID As Integer) As String Implements Microsoft.Office.Interop.SmartTag.ISmartTagAction.VerbNameFromID
Get
'imposto i vari id
Select Case VerbID
Case 1
Return "sendemail"
Case 2
Return "site"
End Select
End Get
End Property
Compilazione del progetto
Dopo aver creato le varie classi, dobbiamo impostare una proprietà del progetto ossia la voce “Registra per interoperabilità Com”.
Facciamo click con il pulsante destro del mouse sul nome del progetto, scegliamo proprietà, verrà aperta una finestra(figura 6), scegliamo la voce proprietà di configurazione e selezionamo la voce Generazione. Mettiamo la spunta alla voce “Registra per interoperabilità com” Come mostrato nella figura qui di seguito.

Figura 6
A questo punto facciamo click sul pulsante ok.
Creazione delle chiavi di registro
Andiamo nel registro del sistema tramite il comando regedit alla voce esegui situato nel menu di avvio di windows. Una volta aperto il registro di windows cerchiamo la seguente chiave
\Hkey_current_Users\Software\Microsoft\office\common\smart tag\actions\
a questa chiave inseriamo una nuova chiave con il codice della nostra guid della classe Action ossia
{0C832FB2-717D-443f-AD90-DBFE42072FFE}
A tale chiave inseriamo due valori stringa uno con il nome Assembly che avrà il seguente valore
SmartTagEmanuele, Version=1.0.1985.25679, Culture=neutral, PublicKeyToken=null
e l’altro Type con il seguente valore:
SmartTagEmanuele.Action
Come mostrato alla figura 7

Figura 7
Cerchiamo la chiave la Recognizers sotto alla voce smart tag, e si crea una nuova chiave con il valore della guid della classe recognizers ossia
{5CFC6CE8-6A70-4b68-9500-8480DBA013DA}
Anche questa chiave avrà i due valori stringa Assembly e Type.
Assembly:
SmartTagEmanuele, Version=1.0.1985.25679, Culture=neutral, PublicKeyToken=null
Type:
SmartTagEmanuele.Recognizer
Come mostrato in figura 8

Figura 8 - http://www.blogema.altervista.org/smarttagvbnet8.jpg
Chiudiamo il registro del sistema e compiliamo il nostro progetto.
Apriamo word, selezioniamo la voce opzioni di correzione automatica, situato nel menu strumenti, nella finestra che viene aperta, selezioniamo la pagina smart tag.
Mettiamo la spunta alla voce “contrassegna testo con smart tag” e la spunta anche alla voce mostra pulsanti azioni smart tag. A questo punto facciamo click su ok e chiudiamo il programma Word.
Apriamo word e digitiamo la parola “Emanuele” o quella che avete scelto voi, vedrete apparire uno smart tag su tale parole. Assicurarsi che il vostro smart tag venga visualizzato nella finestra dei smart tag (figura 5).
I possibile errori possono essere i seguenti:
Nomi errati della classe o del progetto.
La proprietà smarttagname deve iniziare con il seguente valore “urn:”
Assicurarsi di aver inserito il codice guid nel registro di sistema con le parentesi graffe all’inizio ed alla fine di tale valore.
Assicurarsi di aver inserito i valori stringa assembley e type per tutte e due le voci (recognizers e Action) e con i valori corretti (nome del vostro progetto)
o quella che avete scelto voi, vedrete apparire uno smart tag su tale parole.
e viene aperta, selezioniamo la pagina a chiamata
Conclusioni
In questo articolo abbiamo visto come creare uno smart tag molto più complesso di quello della lezione precedente.
Creare uno smart tag in Visual Basic.Net non è facile, ma con un’accurata analisi ed attenzione al codice, si possono ottenere risultati molto sorprendenti.
A corredo di tale articolo troverete un esempio.
Download esempio ">Download esempio Se non funziona il donwload, inserire il seguente link, nella barra degli indirizzi web del vostro browser.
http://www.blogema.altervista.org/smarttagemanuele.zip < ST1:SMARTTAGESEMPIO>?>
?>