Comenzemos hablando sobre como podemos hacer para interactuar con MSN Messenger o Windows Live Messenger (De ahora en mas nos referiremos a ellos como Messenger). Existe una referencia para poder trabajar con Visual Basic que nos da opciones que nos permitiran trabajar con Messenger. Lo que haremos nosotros no sera crear la referencia, sino que trabajaremos con el objeto “Messenger.UIAutomation”. Para poder acceder a este objeto desde cualquier parte del codigo debemos declararlo globalmente, pero como lo crearemos en momento de ejecución luego de declararlo globalmente, debemos crear el objeto al iniciar la aplicación, es decir, en el Form_Load. Así que creamos la declaracion global, para ello nos vamos a la parte de codigo y nos situamos al inicio (fuera de cualquier sub y cualquier Function, debe estar suelta), y escribimos esto:
Código: Seleccionar todo
Dim ObjMSN As Object
Código: Seleccionar todo
Set ObjMSN = CreateObject("Messenger.UIAutomation")
Listando Contactos
El objeto del Messenger nos permite obtener la lista de contactos del usuario que se encuentre conectado en ese momento. Lo que hare a continuación sera explicarles de que manera podemos obtener una lista de todos los contactos.
El modo en que se obtiene la lista es a través de una colección, así que debemos usar un bucle For Each en donde crearemos un elemento que hara referencia al contacto actual de la lista. El contacto se obtendra por su casilla, es decir de tipo “[email protected]”. Lo que haremos sera crear un Sub llamado “Listar” y en el formulario agregaremos un List y lo llamaremos “lstContactos”. Dentro del sub Listar incluiremos una rutina para recorrer la lista de contactos y agregar uno por uno a la lista del formulario. Esta sera nuestra primera interaccion con el Messenger, vemaos el codigo:
Código: Seleccionar todo
Private Sub Listar()
'UnContacto va a ser el contacto actual que se toma de la coleccion.
'Hacemos un bucle que recorra todos los contactos y los iremos agregando en la lista.
For Each UnContacto In ObjMSN.MyContacts
'Lo agregamos a la lista...
lstContactos.AddItem UnContacto.SinginName
'Seguimos con la coleccion.
Next
End Sub
Agregaremos un commandbutton que llamara a la funcion Listar. Así que lo que hara este boton sera listar todos los contactos agregandolos a la lista con su casilla correspondiente. Al boton le ponemos como caption “Listar Contactos”
Veamos como tendriamos el code hasta ahora:
Código: Seleccionar todo
Dim ObjMSN As Object
Private Sub Form_Load()
'Creamos el objecto del Messenger
Set ObjMSN = CreateObject("Messenger.UIAutomation")
End Sub
Private Sub Command1_Click()
'Llamamos a funcion que nos _
lista los contactos.
Call Listar
End Sub
Private Sub Listar()
'UnContacto va a ser el contacto actual que se toma de la coleccion.
'Hacemos un bucle que recorra todos los contactos y los iremos agregando en la lista.
For Each UnContacto In ObjMSN.MyContacts
'Lo agregamos a la lista...
lstContactos.AddItem UnContacto.SinginName
'Seguimos con la coleccion.
Next
End Sub
Cuando el boton para cambiar la vista de los contactos (de casilla a nick y viceversa) debemos hacer algo como:
*Crearemos una variable global llamada “Vista” que sera de tipo “Integer”, cuando se pongas la vista de los contactos como casilla, su valor sera 0, en caso contrario sera 1.
*Usar una estructura If para saber como estan listados los contactos.
Así que veamos mas o menos lo que hacemos, antes que nada declaramos globalmente la variable “Vista”, la pondremos arriva de la variable ObjMSN:
Código: Seleccionar todo
Dim Vista As Integer
Ahora debemos programar el boton, el segundo boton lo que hara al hacerle clic sera ver que valor tiene la variable Vista, si es 0, cambia su caption a “Ver Contactos por Casilla” y luego crearemos otro bucle como el del boton 1, pero este sera un bucle que va a ir de 0 hasta la cantidad de elementos en la lista. Es decir que recorrera todos los contactos de NUESTRA lista, los volvera a agregar pero con su nick, luego de agregarlo lo eliminaremos de la lista.. Así que veamos el codigo del segundo boton:
Código: Seleccionar todo
Private Sub Command2_Click()
'Miramos el valor de la variable
If Vista = 0 Then
'Cambiamos el caption del boton
Command2.Caption = "Ver Contactos por casilla"
'Vaciamos la lista
lstContactos.Clear
'Si es 0, pasamos la lista a nick's
For Each VistaNick In ObjMSN.MyContacts
'Agregamos los contactos con su nick
lstContactos.AddItem VistaNick.FriendlyName
Next
'Cambiamos el valor de Vista
Vista = 1
Else
'Cambiamos el caption del boton
Command2.Caption = "Ver Contactos por nick"
'Vaciamos la lista
lstContactos.Clear
'Si es 1, pasamos la lista a casillas
For Each VistaNick In ObjMSN.MyContacts
'Agregamos los contactos con su casilla
lstContactos.AddItem VistaNick.SigninName
Next
'Cambiamos el valor de Vista
Vista = 0
End If
End Sub
Lo que sigue sera establecer contacto con un.. bueno, un contacto ^^. Para hacer esto, tenemos la opcion “InstantMessage” que nos abre la ventana de conversación que le indiquemos. Así que, seguro que ya sabran lo que quiero hacer, agregaremos un botoncito que nos permitira establecer contacto con un contacto seleccionado de la lista. Bueno, para esto debemos conocer tambien las propiedades del control List de VB, ya que debemos identificar el item de la lista seleccionado y debemos obtener la casilla del item seleccionado. Aquí se nos ah complicado un poco, ya que si la vista de la lista esta como vista en “nick” debemos avriguar la casilla que corresponde a ese nick (Para ello usaremos otro bucle, ahora lo explicare), pero si esta como vista en casilla, se nos facilita mucho mas el trabajo, ya que solo debemos obtener el contenido del item (que sera la casilla) y listo.
Lo que veremos a continuación sera como obtener la casilla del contacto si la lista esta como vista en nicks. Lo que haremos sera crear un bucle que liste todos los contactos por su nick, y si este nick coincide con el nick que se selecciono, obtendremos la casilla del contacto y listo!. Pero antes de comenzar con este bucle, debemos crear otro bucle antes de este para actualizar la lista, ya que si el contacto cambio de nick no lo encontraremos nunca… No es tan complicado como suena, así que no se preocupen ;) .
Ahora, agregaremos un nuevo formulario llamado Form2, le creamos una variable PUBLICA llamada Contacto:
Código: Seleccionar todo
Public Contacto As String
Vamos a ver el codigo ya armado, pero como siempre, cada linea bien comentada para que se entienda:
Código: Seleccionar todo
Private Sub Command3_Click()
'si no hay un item seleccionado salimos..
If lstContactos.Selected = False Then: Exit Sub
'Si la vista esta como vista en NICK:
If Vista = 1 Then
'Creamos un bucle que actualize la lista:
For Each UnContacto In ObjMSN.MyContacts
'Lo agregamos a la lista...
lstContactos.AddItem UnContacto.FriendlyName
'Seguimos con la coleccion.
Next
'Ahora que la lista esta actualizada, debemos
'Hacer un bucle igual al anterior pero que lo
'usaremos para comparar los nick's del contacto
'actual de la lista del messenger con el seleccionado
'de la lista lstContactos
For Each Contacto In ObjMSN.MeyContacts
Nick = Contacto.FriendlyName
'Si los nick's cohinciden:
If Nk = lstContactos.List(lstContactos.ListIndex) Then
'Abrimos el Form2 y le damos como valor a su varibale
'global Contacto, la casilla del contacto
form2.Contacto = Contacto.SinginName
form2.Show
End If
Next
'Si la vista esta como casilla
Else
'A la variable contacto del Form2 le damos como valor la casilla
form2.Contacto = lstContactos.List(lstContactos.ListIndex)
'abrimos el Form2
form2.Show
End If
End Sub
Muy bien, ahora debemos programar el Form2. En el form2 lo que haremos sera dar la posibilidad de enviar mensajes al contacto o enviar archivos (cualquier tipo, por supuesto que no podremos mandar archivos que el Messenger no nos permita). Recuerda que al usar “InstantMessage” se abrira la ventana de conversación del Messenger, así que lo que vayamos a hacer debe ser rapido ^^. así que comensemos con crar una funcion que nos permita enviar un mensaje al contacto. Para ello nos dirigimos al Form2 y agregamos 1 TextBox, lo dejaremos con su nombre por defecto “Text1”. Luego, agregaremos un boton al que le daremos como caption “Enviar Mesanje”. Lo que sigue a continuación es muy sencillo, abrimos la ventana de conversación del contacto cuando el usuario haga clic en el boton, y con la funcion “SendKeys” de Visual Basic enviamos la frace que se encuentre en el Text1. Debido que al abrir la ventana de conversación, la caja de texto para enviar mensaje de la ventana se encuentra con el foco, y que presionando enter podemos enviar el mensaje, esto nos facilita muchisisisimo el trabajo. Veamos como sera el codigo:
Código: Seleccionar todo
Private Sub Command1_Click()
'Abrimos la ventana de conversacion
Obj.InstantMessaje Contacto
'Enviamos la frace del textbox
'Lo que hacemos ocn esto es enviar
'la frace letra por letra, como si
'estubiera escribiendo el usuario.
For i = 1 To Len(Text1.Text)
SendKeys Mid(Text1.Text, i, 1)
Next i
'Enviamos Enter para mandar el mensaje
SendKeys "{ENTER}"
End Sub
Bueno, ahora como lo que seguira con la interaccion de contactos es medio compilcado, volveremos al form1 porque me acorde de una cosa muy importante tambien (en realidad 2) que debemos agregar: Cambiar el estado actual y Cambiar el nick
Así que Volvemos al Form1, donde el codigo lo deberiamos tener algo asi:
Código: Seleccionar todo
Dim Vista As Integer
Dim ObjMSN As Object
Private Sub Form_Load()
'Creamos el objecto del Messenger
Set ObjMSN = CreateObject("Messenger.UIAutomation")
End Sub
Private Sub Command1_Click()
'Llamamos a funcion que nos _
lista los contactos.
Call Listar
'Habilitamos el boton para _
cambiar la vista de los _
contactos actuales.
Command2.Enabled = True
End Sub
Private Sub Command2_Click()
'Miramos el valor de la variable
If Vista = 0 Then
'Cambiamos el caption del boton
Command2.Caption = "Ver Contactos por casilla"
'Vaciamos la lista
lstContactos.Clear
'Si es 0, pasamos la lista a nick's
For Each VistaNick In ObjMSN.MyContacts
'Agregamos los contactos con su nick
lstContactos.AddItem VistaNick.FriendlyName
Next
'Cambiamos el valor de Vista
Vista = 1
Else
'Cambiamos el caption del boton
Command2.Caption = "Ver Contactos por nick"
'Vaciamos la lista
lstContactos.Clear
'Si es 1, pasamos la lista a casillas
For Each VistaNick In ObjMSN.MyContacts
'Agregamos los contactos con su casilla
lstContactos.AddItem VistaNick.SigninName
Next
'Cambiamos el valor de Vista
Vista = 0
End If
End Sub
Private Sub Command3_Click()
'si no hay un item seleccionado salimos..
If lstContactos.Selected = False Then: Exit Sub
'Si la vista esta como vista en NICK:
If Vista = 1 Then
'Creamos un bucle que actualize la lista:
For Each UnContacto In ObjMSN.MyContacts
'Lo agregamos a la lista...
lstContactos.AddItem UnContacto.FriendlyName
'Seguimos con la coleccion.
Next
'Ahora que la lista esta actualizada, debemos
'Hacer un bucle igual al anterior pero que lo
'usaremos para comparar los nick's del contacto
'actual de la lista del messenger con el seleccionado
'de la lista lstContactos
For Each Contacto In ObjMSN.MeyContacts
Nick = Contacto.FriendlyName
'Si los nick's cohinciden:
If Nk = lstContactos.List(lstContactos.ListIndex) Then
'Abrimos el Form2 y le damos como valor a su varibale
'global Contacto, la casilla del contacto
Form2.Contacto = Contacto.SinginName
Form2.Show
End If
Next
'Si la vista esta como casilla
Else
'A la variable contacto del Form2 le damos como valor la casilla
Form2.Contacto = lstContactos.List(lstContactos.ListIndex)
'abrimos el Form2
Form2.Show
End If
End Sub
Private Sub Listar()
'UnContacto va a ser el contacto actual que se toma de la coleccion.
'Hacemos un bucle que recorra todos los contactos y los iremos agregando en la lista.
For Each UnContacto In ObjMSN.MyContacts
'Lo agregamos a la lista...
lstContactos.AddItem UnContacto.SinginName
'Seguimos con la coleccion.
Next
End Sub
Nos vamos a la propiedad List, y agregaremos estos (asi como estan, uno debajo del otro):
En linea
Vuelvo enseguida
No Disponible
Salí a comer
Al telefono
Desconectado
Ausente
Lo que haremos sera cambiar el estado dependiendo del que se halla seleccionado. Veamos como, para esto veamos le codigo, sisi, bien explicadito no te preocupes:
Código: Seleccionar todo
Private Sub Status_Click()
'Miramos que estado se selecciono
Select Case Status.ListIndex
'Si se selecciono el 0 (Conectado)
Case 2: ObjMSN.MyStatus = 10
'Se se selecciono el 1 (V. en seguida)
Case 1: ObjMSN.MyStatus = 14
'Si se selecciono el 2 (No Disponible)
Case 2: ObjMSN.MyStatus = 30
'3 - Sali a comer
Case 3: ObjMSN.MyStatus = 66
'4 - Al Telefono
Case 4: ObjMSN.MyStatus = 50
'5 - Desconectado
Case 5: ObjMSN.MyStatus = 6
'6 - Ausente
Case 6: ObjMSN.MyStatus = 34
End Select
End Sub
Al primer boton le ponemos como caption “Agregar contacto”, y su codigo sera sencillo.. Pero antes vamos a ver algo, para eliminar el contacto y para agregarlo usaremos InputBox. Muy sencillo su uso, así que vamos por el code del primer boton (el primero de los ultimos que agregamos):
Código: Seleccionar todo
Private Sub Command4_Click()
'agregamos un contacto
'Almacenamos en X el contacto que introdusca
'El usuario en el inputbox
X = InputBox("Contacto:", "Agregar un contacto")
'agregamos el contacto...
ObjMSN.AddContact X
End Sub
Código: Seleccionar todo
Private Sub Command5_Click()
'eliminamos un contacto
'Almacenamos en X el contacto que introdusca
'El usuario en el inputbox
X = InputBox("Contacto:", "Eliminar un contacto")
'Eliminamos el contacto
ObjMSN.RemoveContact X
End Sub
Código: Seleccionar todo
Private Sub Command6_Click()
'Usamos OpenInbox para abrir
'El explorador web enviando
'como comando el enlace
'que nos abre la bandeja de entrada
'del usario actal. Como todos saben
'Este enlace es casi imposible saberlo,
'para resumir todo, nos dispone OpenInbox ;)
ObjMSN.OpenInbox
End Sub
Esta es la funcion que nos faltaba… Si se preguntan si el objeto nos permite enviar archivos, pos no, tiene una funsion que creo, ojo! Creo.. que serivia para enviar ficheros, pero ya no funciona,
Lo que debemos hacer para enviar archivos es copiarlos al portapapeles y luego enviar las teclas ctrl. + v (pegar) asi se enviara automáticamente el archivo. Pero… ¿Cómo hacemos para copiar el archivo a portapapeles?, bueno, esta es una tarea un poco difícil (de hacer y explicar), lo que hare sera crear un funcion que atravez de la utilización de API’s copie el fichero que le pasamos como argumento. Esta funcion la hice en base al modulo que creo Hendrix para la propagacion por Messenger, pos yo solo me fije como lo hacia y pos usaba una funcion que copiaba a portapapeles. Así que comence a buscar las api’s y ver como funcionaban, me fui guiando en algunos casos con el codigo de Hendrix.
Veamos, nos vamos a dirigir a laparte superior del codigo, nos situamos arriva de las declaraciones globales que tenemos en el Form2 (Lee bien, en el FORM2) y declaramos estas API’s:
Código: Seleccionar todo
Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Const CF_HDROP = 15
Private Type DROPFILES
pFiles As Long
End Type
Código: Seleccionar todo
'funcion que se le pasa como parametro la ruta
'completa del fichero a copiar.
Private Function CBfile(File As String) As Long
'Declaracion de variables
Dim Rt As Long, Rt2 As Long
Dim Dt As DROPFILES
'si el portapapeles tiene algo..
If OpenClipboard(0) <> 0 Then
'Se vacia
EmptyClipboard
'Le agregamos un caracter nulo al final de la ruta del archivo pasado
File = File & vbNullChar
'Usamos esta funcion para reservar un espacio en memoria (preparar para
'copiar el archivo, por decirlo asi)
Rt = GlobalAlloc(GHND, Len(Dt) + Len(File))
If Rt <> 0 Then
'Bloqueamos el espacio creado anteriormente
'sino puede que este espacio sea movido a
'otra direccion de memoria y no encontrariamos el archivo.
Rt2 = GlobalLock(Rt)
'Declaramos la longitud del archivo
Dt.pFiles = Len(Dt)
'Movemos el archivo para la copia ;)
CopyMemory ByVal Rt2, Dt, Len(Dt)
CopyMemory ByVal Rt2 + Len(Dt), ByVal File, Len(File)
'Desbloqueamos el espacio en memoria
GlobalUnlock Rt
'Usamos esta funcion para obtener los datos de cierta posicion
'de memoria, y aplicarla al portapapeles (la posicion en este caso
'es la del fichero)
SetClipboardData CF_HDROP, Rt
End If
'Ya tenemos copiado el archivo, usamos esta funcion para Cerrar el portapapeles
CloseClipboard
End If
End Function
Así que ya podemos poner el fichero alli, (en nuestro ejemplo del boliche, ya podemos empezar a meter a las personas). Para poner datos en memoria usamos CopyMemory. Así que, ya tenemos el archivo en memoria. Ahora solo debemos desbloquearlo para darcelo al portapapeles. Así que, lo desbloqueamos, y con la funcion SetClipboardData aplicamos los datos, en este caso, el fichero que esta en memoria…
Así que, hasta aquí ya tenemos el fichero copiado, ahora lo unico que hacemos es cerrar el portapapeles y listo!!. Ahora solo devemos poner un ctrl. + v para pegar el fichero.
Así que, la funcion anterior la situan al final del codigo que tenemos en Form2. Y ahora nos dirigimos a la parte de diseño.
Agregamos un control CommonDialog, para esto nos dirigimos al menú “Proyecto”?”Componentes” y buscamos “Microsoft CommonDialog”, lo tildamos y le damos a aceptar. Luego lo agregamos al formulario, y le cambiamos su nombre a “cd”.
Ahora agregamos otro boton, y en el caption le ponemos “Enviar archivo”. Y en el codigo del boton ponemos esto:
Código: Seleccionar todo
Private Sub Command2_Click()
'Ponemos titulo de la ventana de dialogo
cd.DialogTitle = "Archivo a enviar..."
'Abrimos para abrir..
cd.ShowOpen
'La variable Fichero va a tener la ruta completa del archivo elegido
Fichero = cd.FileName
'Le Pasamos a la funcion la ruta del archivo
'Y asi lo copiamos
Call CBfile(Fichero)
'Ya lo tenemos en el portapapeles
'Ahora abrimos la ventana de conversacion:
ObjMSN.InstantMessage Contacto
'Le damos un respiro a Windows
DoEvents
'Enviamos un Ctrl + v
'La tecla Ctrl se representa con el caracter "^"
SendKeys "^V"
'Listo, con esto ya debemos aber enviado el fichero
End Sub
Les dejo un saludo…
ANYD00M
disculpen lo largo del post, pero me parecio muy interesante el manual... ademas de ser una buena funcion para un troyano.