No se como algo tan sencillo puede acabar resultando tan complicado…
Hace bastante tiempo estuve enredando con losAddIn’s de MSN Messenger. A raíz de lo de las voces, estuve mirando por System y me encontré System.Speech, y pensé que sería sencillísimo hacer uno que leyese lo que te escriben (iluso de mi). Lo que es hacerlo es de lo más sencillo, pero después que funcione no lo es tanto…
Empecemos por el principio. Un AddIn es lo que toda la vida se ha llamado plugin. En nuestro caso, se puede crear una dll que cumpla determinadas condiciones para cargar en el MSN Messenger y así añadirle funcionalidad.
HABILITAR ADDIN’S PARA MSN MESSENGER
Para habilitar los add in debemos añadir en el registro de windows un valor de tipo DWORD con el nombre AddInFeatureEnabled en la clave HKEY_CURRENT_USER\Sofgtware\Microsoft\MSNMessenger\ y asignarle un 1. En este archivo hay un .reg que hace esto automáticamente. Hecho esto, al reiniciar el messenger en Herramientas\Opciones encontraremos (creo que solo es a partir de la version 8) un nuevo apartado llamado Accesorios en el que se puede indicar la dll del accesorio que queremos añadir (por ejemplo la que está en el mismo rar). Con esto el AddIn queda agregado pero no activo, pero no nos adelantemos.
ESTRUCTURA DE UN ADDIN PARA MSN MESSENGER
Un add-in es una dll que tiene como nombre EspacioDeNombres.Clase.dll. Esta dll deberá tener una referencia a MessengerClient.dll (por lo tanto deberá estar junto a esta para ejecutarse correctamente), en todos los sitios que he leido indican que hay que añadir también el espacio de nombres Microsoft.Messenger, pero supongo que si lo antepones a cualquier miembro de ese espacio no es necesario. El proyecto tiene que tener un espacio de nombres, que deberá se el mismo que se indique en la primera parte del nombre de la dll. Además debe existir una clase (cuyo nombre es la segunda parte del nombre de la dll) que implemente la interfaz IMessengerAddIn cuyo único requisito es que exista un metodo initialize:
Sub Initialize(ByVal ElMessengerClient As MessengerClient) Implements IMessengerAddIn.Initialize
En este caso ElMessengerClient es el objeto que lanza los eventos que podemos controlar, y sobre el que podemos realizar acciones como enviar mensajes, etc. por este motivo es recomendable que nos le guardemos. Algunos eventos que pueden interesarnos son:
'Se dispara cuando llega un mensaje Private Sub MiClienteMSN_IncomingTextMessage(ByVal sender As Object, ByVal e As Microsoft.Messenger.IncomingTextMessageEventArgs) Handles MiClienteMSN.IncomingTextMessage ... 'Se dispara cuando se aprieta el botón de configuración del accesorio Private Sub MiClienteMSN_ShowOptionsDialog(ByVal sender As Object, ByVal e As System.EventArgs) Handles MiClienteMSN.ShowOptionsDialog ...
USO DE UN ADDIN PARA MSN MESSENGER
Es tan simple como colocar la dll adecuada donde queramos, pero asegurandonos de que tiene a su lado la dll MessengerClient.dll que encontraremos en el directorio de intalación del messenger. Por ejemplo la podemos colocar en (directorio por defecto) c:\Archivos de programa\MSN Messenger\. Una vez hecho esto y teniendo habilitados los addin como hemos indicado antes, abrimos el messenger y vamos a herramientas>opciones>accesorios y pulsamos en [Agregar a Messenger] exploramos hasta el lugar en el que la hemos puesto, la seleccionamos y aceptamos. Si este AddIn implementa un manejador de ShowOptionsDialog se habilitará el botón [Configuracion] a traves del cual normalmente se podrá configurar el AddIn. Una vez hecho esto esta añadido, pero no activo, podremos indicar ahí que se active automaticamente con el cambio de estado, o bien, activarlo manualmente desde la venta principal del messenger en la «flecha» que sale junto al nombre.
ACCESO DE UN ADDIN A LOS RECURSOS DEL SISTEMA
Hasta aquí la parte sencilla, con esto podremos hacer un bonito robot con el que hablen nuestros amigos cuando no estemos, y poco mas…. Al parecer los AddIn se ejecutan en una «caja de arena», un entorno seguro para que no pueda hacer nada que comprometa la seguridad sin que el usuario sea consciente de ello. Esto provoca que no podamos acceder a los recursos del sistema, por lo tanto nos condena a no hacer practicamente nada.
Por ejemplo no podemos crear un objetoSpeechSynthesizer para hacer que el sistema nos lea los mensajes que recibimos. Si hacemos esto en uno de los manejadores de eventos (o el procedimiento Initialize) directamente obtendremos un error 8013150A, o si lo hacemos en una función que se llame desde uno de los manejaremos nos dirá que«Ese ensamblado no permite llamadores de confianza parcial».
LLegados a este punto te puedes volver loco a mirar por el msdn, y todo el sitio de microsoft, yo al menos no he encontrado nada de nada. Asombrosamente la solución la encontré en un sitio de microsoft, pero es algo como «alternativo», y para colmo a esa pagina llegue a traves de unos blogs chinos o japoneses o lo que sea (salían caracteres que no se leer). Lo que nos interesa empiza a partir de «Add-ins run under Code Access Security….» básicamente dice que lo que hay que hacer es firmar el componente, y añadirlo a la cache de ensamblados global. Lo de firmarlo se puede hacer mediante las propiedades del proyecto, y lo de añadirlo a la cache los que tengamos intalado algún visual studio podemos usar el gacutil (segun donde tengamos las cosas y que versiones tengamos):
"C:\Archivos de programa\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /i "C:\Archivos de programa\MSN Messenger\LectorWLMAddIn.AddIn.dll"
Si todo ha ido bien nos dirá «Ensamblado agregado correctamente a la caché.». LLegado a este punto si podremos acceder a los recursos del sistema (entrada/salida, web, etc.).
Si nos damos cuenta esto es de lo mas simple, es una manera de que el usuario diga que dicha dll es de confianza y que puede hacer lo que quiera, pero no, no se les ocurre decirlo donde se habla de la API ni nada por el estilo. Con lo facil que habría sido decir algo como (perdonar mi ingles): «For security your AddIn will execute in a sandbox that not permit acces to IO system and other system resources. If you want this you must sign the assemby and add it to the global assembly cache (GAC)», vamos digo yo, y así no me habría matado mirando y probando cosas como compartición de objetos, etc., etc., etc. Perdonar la exaltación, pero es que hasta que lo encontré he dado mil vueltas…
Bueno, a parte del archivo que os he indicado antes que contiene la dll y el .reg para habilitarlo, he colgado el proyecto, por si alguien quiere echarle un vistazo, o incluso extenderlo. A partir de ahi supongo que se podrían configurar para que contactos queremos tenerlo activado y para cuales no, o incluso que voces queremos usar para cada uno de estos.
Aquí os dejo algunos enlaces donde hay mas ejemplos: [1] [2] [3] [4] [5]