Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1731, comments - 2327, trackbacks - 356

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Microsoft MVP

My MVP Profile

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

Il mio libro su VB2012!

Il mio nuovo libro su Visual Basic 2012 E' uscito il mio libro "Visual Basic 2012 Unleashed". Clicca sulla copertina per informazioni!

Visual Basic Tips & Tricks Team Member

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!


Guarda i miei webcast MSDN

Altri spazi

CodePlex download Scarica i miei progetti open-source su CodePlex!

Cerca nel blog



Seguimi su Twitter!

Article Categories

Archives

Post Categories

Image Galleries

.NET Framework

Back to basics

Blogroll

Help 1.x e 2.0

Microsoft & MSDN

Setup & Deployment

Visual Basic .NET e 2005

Scrivere add-in per Windows Live Messenger con Visual Basic 2005

LA PREMESSA

Grazie al .NET Framework 2.0 ed ai linguaggi gestiti appartenenti a tale tecnologia, è possibile scrivere componenti aggiuntivi per Windows Live Messenger (8.0 o superiore), il noto programma di messaggistisca istantanea di Microsoft. Per realizzare un componente aggiuntivo, è necessario creare un progetto di tipo "libreria di classi", qualunque sia il linguaggio prescelto. In questo post tratterò, ovviamente, Visual Basic 2005. In secondo luogo è necessario aggiungere un riferimento all'assembly MessengerClient.dll contenuto nella cartella C:\Programmi\MSNMessenger.

Tralasciando l'elenco di tutti i numerosi oggetti esposti da questo assembly, per i quali potete consultare la documentazione MSDN (vedi link più avanti). L'assembly MessengerClient.dll espone un namespace chiamato Microsoft.Messenger, al cui interno è implementata l'interfaccia IMessengerAddin che, come suggerisce il nome, predispone quanto richiesto da un componente aggiuntivo per Messenger. L'assembly in questione, inoltre, espone alcuni eventi che è possibile intercettare al fine di far compiere al nostro Messenger le operazioni che riteniamo necessarie in quel dato frangente.

IL CASO PRATICO

Ok, ma cosa ci facciamo con un add-in? beh, partiamo dall'idea che ha spinto me a crearmene una. Solitamente, quando la sera mi alzo dalla scrivania per andare a prepararmi la cena e a mangiare, imposto il mio stato personale su "A pranzo" per far capire che sono assente. Ciononostante capita che spesso alcuni miei contatti non facciano caso al mio stato personale e che mi inviino dei messaggi ai quali, ovviamente, non posso rispondere. Onde evitare che questo faccia dispiacere a chi mi scrive, ho pensato che forse Messenger poteva rispondere al mio posto in mia assenza: nel momento in cui imposto lo stato su "A pranzo", Messenger deve inviare un messaggio automatico a chi mi ha scritto dicendo che sono impegnato e che sarò io a ricontattare non appena possibile.

IL CODICE

Come si traduce in codice tutto questo? Proviamo a seguire i seguenti passaggi:

  1. si crea una nuova libreria di classi e si implementa l'interfaccia IMessengerAddin;
  2. all'interno del metodo Initialize aggiunto, si ottiene l'istanza corrente di Messenger che è un oggetto di tipo MessengerClient;
  3. si specificano alcune proprietà dell'add-in tramite l'oggetto MessengerClient.AddinProperties;
  4. si implementa un gestore dell'evento IncomingTextMessage, che si verifica quando un contatto ci scrive.

Il codice che realizza l'add-in è il seguente (i commenti sono inseriti nell'archivio zip che ho predisposto, di cui parlo più avanti):

Imports Microsoft.Messenger

Public Class Autoreply

       Implements IMessengerAddIn

                Private WithEvents myClient As MessengerClient

                Public Sub Initialize(ByVal messenger As Microsoft.Messenger.MessengerClient) _

Implements Microsoft.Messenger.IMessengerAddIn.Initialize

                        myClient = messenger

                        With myClient.AddInProperties
                            .FriendlyName = "Messenger Autoreply Add-in"
                            .Creator = "Alessandro Del Sole"
                            .Description = "Add-in per risposte automatiche in caso di assenza"
                            .Url = New Uri("
http://community.visual-basic.it/Alessandro")
                            .PersonalStatusMessage = "Sono in cucina a cena"
                        End With

               End Sub

               Private Sub myClient_IncomingTextMessage(ByVal sender As Object, ByVal e As IncomingTextMessageEventArgs) _

Handles myClient.IncomingTextMessage

                       If myClient.LocalUser.Status = UserStatus.OutToLunch Then

                          myClient.SendTextMessage("Questo è un messaggio automatico. Non posso risponderti perchè sto cucinando. _

Ti contatto io appena ho finito", e.UserFrom)

                        End If
               End Sub

    End Class

Una volta scritto il codice, prima di compilare l'assembly, è necessario tener presente che il nome dell'assembly e il nome del combinato namespace-classe devono coincidere: se l'assembly si chiama (per esempio) Messenger.Addin.dll, nella finestra My Project il namespace di primo livello deve essere chiamato Messenger e la classe deve chiamarsi Addin, per una questione di riconoscimento da parte di Messenger.

Sempre a proposito di Messenger, è fondamentale sapere che, affinchè questo sia in grado di riconoscere e accettare componenti aggiuntivi, è necessario aggiungere una nuova chiave di registro, che deve chiamarsi HKEY_CURRENT_USER\Software\Microsoft\MSNMessenger\AddInFeatureEnabled e deve essere di tipo DWORD, con valore 1. Solo dopo aver aggiunto questa chiave Messenger sarà in grado di accettare componenti aggiuntivi.

Fatto questo, aprite Messenger e visualizzate la finestra delle opzioni. Noterete che sarà ora presente la scheda "Componenti aggiuntivi", come in figura:

Fate clic sul pulsante "Aggiungi a Messenger" e selezionate l'assembly creato in precedenza. L'add-in deve essere attivato manualmente. Per farlo, fate clic sul menu dell'impostazione dello stato personale e dal menu contestuale selezionate "Attiva Messenger Autoreply", come in figura:

Perfetto. Ora provate a impostare lo stato personale su "A pranzo" e aspettate che qualche contatto vi invii un messaggio. Magia! Messenger risponde in automatico che siete impegnati in cucina e che risponderete non appena possibile. Bello no? :D

Per disattivare l'add-in dovete eseguire lo stesso passaggio fatto per attivarla.

Grazie a .NET Framework 2.0, con poche righe di codice e un po' di studio è possibile estendere e personalizzare in maniera eccezionale Windows Live Messenger a seconda delle proprie esigenze.

Qui c'è la documentazione ufficiale per programmare Windows Live Messenger: http://msdn2.microsoft.com/en-us/library/aa905655.aspx

Ho predisposto un archivio zip che potete scaricare da qui: http://www.visual-basic.it/scarica.asp?ID=903

All'interno dello zip c'è il progetto dell'add-in sopra illustrata comprensivo di dettagliati commenti, un file .reg per aggiungere al registro di Windows quanto richiesto con un solo clic di mouse e un file .vsi che installerà tra i modelli di Visual Studio 2005 un modello per la creazione di add-in per Windows Live Messenger. E non dite che non vi voglio bene... :D

Alessandro

Print | posted on venerdì 27 aprile 2007 21:37 | Filed Under [ Visual Basic ]

Feedback

Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Ottimo. ho scaricato il file zip e messo pronto per lo studio.
29/04/2007 02:11 | Stefano Pranzo
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Stefano mi faceva notare con una mail privata che viene richiesta una password quando si apre il progetto. Tale password contrassegna lo strong-name, ossia quella sorta di firma digitale necessaria agli assembly per un corretto utilizzo da parte di .NET (non, quindi, all'interno di Visual Studio) e costituita da una coppia di chiavi pubblica-privata.
La password per lo strong-name che ho inserito si trova nei commenti al codice sorgente, in ogni caso anche se non la inserite subito l'IDE vi consente ugualmente di aprire il progetto, in quanto la password costituisce solo una chiave della coppia.
Provate ad aprire il progetto, leggete la password e inseritela alla successiva apertura... ;-)

Per ulteriori info sugli strong-name, il mio libro li descrive.. :-)

Alessandro
29/04/2007 05:26 | Alessandro Del Sole
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Ciao Alessandro,
stavo provando a modificare la classe per fare in modo che possa leggere da un file di testo i corrispondenti testi (stavo provando per Torno Subito, Occupato e A Pranzo).
Da premettere che sono neofita del VB2005.
Volevo sapere come faccio a far si che la classe legga da un file di testo le frasi automatiche, in modo che ognuno possa personalizzare le sue risposte automatiche.
Spero di essere stato chiaro.

Ciao,
Marcello
03/05/2007 19:13 | Marcello
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Ciao, ho provato a crearmene uno io e anche a usare il tuo che hai creato tu, ma non mi funzionano!
Credo che la colpa sia del "Plus! Live Messenger" che me lo blocca, adesso provo a disinstallarlo.
Comunque se non fosse quello cosa credi che ci sia di sbagliato?
03/05/2007 19:37 | Giovannibart91
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Per GiovanniBart91: non ti funzionano, ma suppongo che avrai dei messaggi di errore... a che punto non ti funzionano? cerca di essere più preciso ;-)
03/05/2007 19:45 | Alessandro Del Sole
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Non so se ho ben capito cosa vuoi fare, magari nell'evento IncomingTextMessage potresti implementare il codice che legga le frasi dal file di testo, come singole righe, e passare la frase letta dal file come argomento del metodo SendTextMessage, invece di una stringa predefinita come ho fatto io.
Le possibilità sono molteplici.. potresti creare una sub che legge le frasi di un file di testo e memorizzarle in un array di stringhe, per poi richiamare una data stringa a seconda dello stato personale...

Alessandro
03/05/2007 19:48 | Alessandro Del Sole
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Ciao, Marcello.
Anche se non sono Alessandro credo che posso anche io risponderti al tuo ultimo post.
Nel prossimo messaggio metto il codice mentre nel prossimo ancora metterò la spiegazione.
Ciao, giovannibart91.
03/05/2007 19:53 | Giovannibart91
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Per Alessandro:
Non mi funziona nel senso che proprio se qualcuno mi manda un messaggio non succede niente, e neanche con l'autoreplay che hai fatto tu!
03/05/2007 19:55 | Giovannibart91
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Per Marcello, ecco il codice:

Try
Dim frase As String() = My.Computer.FileSystem.ReadAllText("C:\Frasi.dat").Split(Chr(13))
Select Case myClient.LocalUser.Status
Case UserStatus.Away
frase.GetValue(0)
Case UserStatus.Busy
frase.GetValue(1)
Case UserStatus.Idle
frase.GetValue(2)
Case UserStatus.Offline
frase.GetValue(3)
Case UserStatus.Online
frase.GetValue(4)
Case UserStatus.OnThePhone
frase.GetValue(5)
Case UserStatus.OutToLunch
frase.GetValue(6)
Case UserStatus.Unknown
frase.GetValue(7)
End Select
Catch ex As Exception
MsgBox("Si è verificato un errore: " & ex.Message, MsgBoxStyle.Critical, "Errore")
End Try
03/05/2007 19:55 | Giovannibart91
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Per GiovanniBart91, non serve essere Alessandro per rispondere qui sopra! :D

Sei sicuro di aver modificato il registro in modo che Live Messenger accetti add-in? e l'hai attivata come ho spiegato io nel post?
Il codice è sicuramente funzionante, quindi le possibilità di errore si riducono a quelle che ti ho appena detto, oppure a una versione di Messenger inferiore alla 8.0... oppure boh!

Ale
03/05/2007 20:09 | Alessandro Del Sole
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Sempre per Marcello:

Allora, dato che sei un "neofita" cercherò di essere il più chiaro possibile:

Nella prima riga ho messo il comando "Try", che assieme a "Catch" e a "End Try" nelle ultime righe impedisce di bloccare irrimediabilmente l'applicazione per eventuali errori ad esempio nella lettura del file, che però vengono segnelati da un messaggio con sopra scritto l'errore che è avvenuto.

Poi nella seconda riga ho dichiarato la variabile "frase" come ARRAY DI STRINGA, e non come STRINGA, i cui "contenitori" dell'array sono composti dal file "Frasi.dat" spezzettato in ogni sua riga (infatti "chr(13)" è il comando "Invio", appunto quello che manda la linea a capo.).

Poi ho usato l'istruzione "Select case", che praticamente consente di gestire al meglio tutti i possibili casi di "stato utente", cioè quelli "A pranzo", "Non al computer" ecc...
Ogni caso, appunto, si deve introdurre con la parola "Case" e nella riga seguente le istruzioni da seguire per quel determinato "caso".
Ad esempio: se ho messo il contatto in stato "A pranzo", nella riga successiva c'è scritto:
"frase.GetValue(6)"
che significa che il programma deve provare a leggere il file "C:\Frasi.dat", spezzettare il testo in tante parti quante sono le righe e prendere la 6° riga in cui c'è appunto la frase da usare se lo stato è "A pranzo".

Ovviamente il "frase.getvalue" lo devi applicare ad una variabile, ad esempio "VARIABILEFRASE = frase.GetValue(6)".

Spero di essere stato abbastanza limpido per ogni riga esplanando il significato di quasi ogni parola, comunque se hai ancora dei dubbi non esitare a ripostarmi!

Ciao e buona fortuna con il VisualBasic, se lo impari bene poi non te lo scordi più!
Giovannibart91
03/05/2007 20:15 | Giovannibart91
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Per Alessandro:
Ho soltanto attivato la chiave di registro che avevi creato tu nel file zippato e poi avevo anche controllato ed è tutto a posto...
Comunque non è detta ancora l'ultima parola perchè devo ancora provare a disinstallare il "Plus!". :))
03/05/2007 20:17 | Giovannibart91
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Per Giovannibart91:
innanzitutto grazie!! E' il minimo.
Poi, ti volevo chiedere in quale parte dell'esempio di Alessandro bisogna mettere il codice perché io avevo provato a mettere del codice nell'evento IncomingTextMessage (proprio come diceva Alessandro nella risposta) che leggesse un file testo "C:\TestFile.txt" però ogni volta mi da errore quando tenta di leggere il file.
Ti allego le righe di codice, sperando di non aver scritto follie.

Dim Textline As String
Dim Messaggio As String

'Open file.
FileOpen(1, "C:\TestFile.txt", OpenMode.Input)

'Loop until end of file.
Do While Not EOF(1)
'Read line into variable.
TextLine = LineInput(1)
If Mid(TextLine, 1, 14) = "[TORNOSUBITO]:" Then
Messaggio = Mid(Textline, 15, 100)
ElseIf Mid(Textline, 1, 14) = "[SONOAPRANZO]:" Then
Messaggio = Mid(Textline, 15, 100)
ElseIf Mid(Textline, 1, 15) = "[SONOOCCUPATO]:" Then
Messaggio = Mid(Textline, 16, 100)
End If

Loop

FileClose(1)
04/05/2007 18:58 | Marcello
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Per Giovannibart91:
ho provato il tuo codice (l'ho messo nell'evento IncomingTextMessage, però mi da un errore sulla riga Dim frase As String() = My.Computer.FileSystem.ReadAllText("C:\Frasi.dat").Split(Chr(13)).
L'errore è: "Richiesta di autorizzazione di tipo System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c......" non soddisfatta
Cosa vuol dire...

Ciao,
Marcello
04/05/2007 19:18 | Marcello
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Per quanto riguarda l'errore di quest'ultimo messaggio, credo che tu non disponga delle autorizzazioni necessarie per utilizzare il file system con .NET. Sei amministratore del pc che usi?
Poi... in VB 2005, un file di testo non si legge come nel messaggio precedente, è scritto completamente in VB 6 e non va più bene!!!

In .NET un file di testo si legge così (presuppone una direttiva Imports System.IO):

Dim file As New StreamReader("C:\TextFile.txt")
Dim textLine As String
Try

Do
'legge la riga di testo
textLine = file.ReadLine

'qui metterai il codice per elaborare la riga
'......
Loop

Catch ex As EndOfStreamException
file.Close()
End Try

In questo modo funziona?
Ricorda, inoltre, che con .NET 2.0 le funzioni per lavorare sulle stringhe appartengono alla classe Strings: Strings.Left, Strings.Right, eccetera.

Alessandro
04/05/2007 19:27 | Alessandro Del Sole
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Per Alessandro.
Certo che sono l'amministratore del pc.
Il codice che dici essere scritto in VB6, non ricordo di preciso da dove l'ho scaricato, comunque in VB6 io uso tutt'altra tecnica.
Per il codice che mi hai segnalato, non va bene quello che mi diceva Giovannibart91 ?

Grazie!
Marcello
04/05/2007 23:26 | Marcello
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Anche il suo va bene ugualmente.L'importante è che sia .NET-oriented,e quello che usavi tu non lo è :-) e sia per te stesso, per imparare la mentalità .NETtiana, sia per evitare errori.

In ogni caso, prova anche il mio codice e vedi se l'errore permane. Quindi, posto che abbiamo utilizzato codice corretto per leggere il file, rimane il problema dei pemessi di I/O. Prova a inserire il seguente attributo prima della dichiarazione della classe:

<Assembly: System.Security.Permissions.FileIOPermissionAttribute( _
System.Security.Permissions.SecurityAction.RequestMinimum, _
Read:="c:\frasi.dat")>

Questo fa si che .NET Framework richieda al computer il permesso di compiere un'operazione sul file specificato.
Fammi sapere
Ale
05/05/2007 00:02 | Alessandro Del Sole
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Addirittura, mettendo l'attributo non me lo fa neanche caricare come componente aggiuntivo. Mi da direttamente errore nel caricamento; mi dice "impossibile attivare il componente aggiuntivo 80131417"

Ciao e grazie per la pazienza

Marcello
05/05/2007 00:09 | Marcello
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Non ringraziarmi per la pazienza,per me è un piacere poter discutere di certe cose e poi interessa anche a me sapere che tipo di problemi si riscontrano nell'utilizzare il codice che propongo.

Il problema, evidentemente, sta in Messenger. Cerchiamo di fare tutti una ricerca su MSDN e su Google in merito a questa problematica e vediamo se è già stata affrontata e risolta e..aggiorniamoci! ;-)

Ale
05/05/2007 03:29 | Alessandro Del Sole
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Ok, ho capito il problema.
Gli add-in per Messenger vengono eseguiti secondo un set di permessi limitato, di tipo "Internet zone". Ciò significa che non possono accedere ai file, al registro e altre cose.
Allora hai due possibilità:

1. Installare l'assembly dell'add-in nella GAC (tanto è già dotato di strong-name) e riprovare;
2. Invece di un classico file e una classica cartella, potresti scrivere e leggere file dall'Isolated Storage, per il quale ti rimando a un mio articolo di poco tempo fa su VB T&T.

Non ho al momento possibilità di provare, se tu riesci fammi sapere, così invece che scrivere feedback qui ne facciamo un vero e proprio post.
Alessandro
05/05/2007 04:16 | Alessandro Del Sole
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Ho fatto delle prove, tentando di leggere un file di testo come hai fatto tu. In effetti, anche se non ricevo lo stesso messaggio di errore, Messenger rifiuta il caricamento dell'add-in, per i motivi che ti ho detto prima.

Tuttavia, installando l'assembly nella GAC, Messenger carica il componente.

Ora ne faccio un post pubblico per tutti, per altre info ci aggiorniamo. Fammi sapere, mi raccomando..

Alessandro
05/05/2007 04:29 | Alessandro Del Sole
Gravatar

# Scrivere add-in per Windows Live Messenger con VB 2005: problematiche di protezione

05/05/2007 04:43 | Alessandro Del Sole's Blog
Gravatar

# Scrivere add-in per Windows Live Messenger con Visual Basic 2005: problematiche di protezione

05/05/2007 14:44 | Alessandro Del Sole's Blog
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Riuscite a far aprire la finestra delle impostazioni? inoltre se qualcuno lo sa, è possibile anche programmarci in c++?
e inoltre ancora sapete dirmi come hanno realizzato questo addin http://www.merletn.org/lab/wlm/it ? grazie
09/06/2007 06:18 | Manuel
Gravatar

# re: Scrivere add-in per Windows Live Messenger con Visual Basic 2005

Puoi usare C++ .Net (ossia quello managed). Per quanto riguarda l'add-in, presumo che abbiano implementato una qualche interazione col sistema operativo.
Mescolerai, quindi, le nozioni di base imparate con il mio post con altre tecniche di programmazione e un po' di fantasia-studio.. ;-)

Alessandro
09/06/2007 23:10 | Alessandro Del Sole

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 5 and 1 and type the answer here:

Powered by:
Powered By Subtext Powered By ASP.NET