Esta aplicación usa el OCX de Windows Media Player 9 mediante
la agregación de una referencia en el proyecto (el OCX se encuentra en
la lista de objetos COM). En esta aplicación el OCX no se muestra
al usuario y sus funciones se substituyen con botones y código propio. Es necesario
tener instalado Windows Media Player 9 para poder ejecutar
la aplicación generada. Este control ActiveX nos proporciona funcionalidades
de reproducción de archivos multimedia (mp3, wav, wma, avi, etc...) sin que
tengamos que crear código específico para esas funciones. Los pasos requeridos
para crear el ejercicio son:
1 - Instalar los programas
necesarios:
- Microsoft Visual Basic .NET y Windows.NET Framework
Software Development Kit (SDK): al instalar Visual Basic .NET se
suele instalar también Windows.NET Framework Software Development Kit (SDK).
- Windows Media Player 9 Series: se trata de la versión
a la que se refiere este ejercicio, versiones anteriores a la 9 no funcionarán
adecuadamente con el código de esta aplicación.
- Windows Media Player 9 Series SDK , necesario para
el desarrollo del programa, además contiene documentación de referencia,
ejemplos de código, utilidades...
2 - Añadir el control
ActiveX al proyecto de Visual Basic .NET:
- en el cuadro de herramientas, mostrar la pestaña "Componentes".
- con el menú contextual "Agregar o quitar componentes" abrimos
el diálogo "Personalizar cuadro de herramientas".
- en la pestaña "Componentes COM" buscamos y marcamos
"Windows Media Player". Si no apareciese en la lista de
componentes, con el botón "Examinar" navegamos en busca de la librería
wmp.dll (suele estar en el directorio
system32).
- de esta manera se añade un elemento nuevo en el cuadro de herramientas,
llamado Windows Media Player, que permite ser incorporado al formulario
como cualquier otra herramienta, bajo el nombre de AxWindowsMediaPlayer1;
este nombre puede cambiarse por otro más útil, en el ejercicio que nos ocupa
se denomina ocxPlayer y así aparece en el código.
- en el menú contextual "Propiedades" del control ocxPlayer
elegimos "Seleccione un modo: Invisible"
para que el control no sea mostrado en el formulario, aunque seguimos teniendo
a nuestra disposición todas sus funcionalidades. Conviene marcar también
"Inicio automático" y elegir el volumen por defecto que tendrá el
reproductor al arrancar. Las demás opciones pueden dejarse como están.
3 - Desarrollar la
aplicación:
El código busca
la construcción de los elementos necesarios ya que el control ActiveX está oculto:
- botones de control (abrir, reproducir, anterior, siguiente, detener,
cerrar).
- etiquetas que muestran el título y el autor del archivo reproducido.
- etiquetas que muestran la duración total del archivo reproducido y el
tiempo de reproducción transcurrido.
4 - Cuadro de diálogo
"Abrir archivo":
En el cuadro
de diálogo "Abrir archivo" OpenFileDialog1 se filtran los archivos
mediante 2 extensiones: MP3 (archivos de audio MP3) y
M3U (listas de reproducción de Winamp), pero estos filtros
se pueden ajustar a nuestro gusto. Al estar oculto el control OCX de
Windows Media Player, no existe ventana de visualización de archivos de vídeo,
por lo que la extensión avi no se incluye en los filtros del control
OpenFileDialog1.
5 - Generar la solución:
Al usar el menú
"Generar solución" del editor de Visual Studio, tendremos en la carpeta correspondiente
(por defecto \bin) 3 archivos:
- ensamblado ejecutable de la aplicación (ejemplo:
MP3 Player.exe).
- las librerías AxInterop.WMPLib.dll
y Interop.WMPLib.dll.
Es necesario tener los 3 archivos juntos en la misma carpeta para que el
programa funcione adecuadamente.
6 - Primary Interop
Assembly (PIA):
La manera de evitar la necesidad de las 2 librerías nombradas en el punto anterior
sería instalando el PIA (primary interop assembly) de Windows
Media Services en la Global Assembly Cache (GAC) y registrando
después la librería mediante RegSvr32. Aunque hay documentación
al respecto (ver este
artículo de Microsoft), es un tema complejo que dejo fuera de este ejercicio.
Ello facilitaría la distribución de la aplicación a otros sistemas aunque, en
su construcción actual, para poder usar la aplicación en ordenadores diferentes
basta con tener Windows Media Player 9 instalado y transportar los 3 archivos
nombrados (ensamblado *.exe, AxInterop.WMPLib.dll
y Interop.WMPLib.dll) a una
carpeta común.
7 - Detalles de código:
- Para centrar
horizontalmente por código el formulario, hay que dar el valor Manual
a su propiedad StartPosition en la ventana de diseño de Visual
Studio y escribir la siguiente línea de texto en el evento Load
del formulario:
' posición x del formulario
Me.Left = (Screen.PrimaryScreen.WorkingArea.Width
- Me.Width) \ 2
- Al cambiar
el estado del reproductor (playing, stopped...)
se desencadena el evento PlayStateChange
que, al ser detectado, nos permite mostrar información sobre la canción
en curso. Como hemos seleccionado Inicio automático
en las propiedades del OCX,
simplemente con abrir un archivo ya cambia el estado de reproducción:
Private
Sub ocxPlayer_PlayStateChange(ByVal
sender As Object,
ByVal e As
AxWMPLib._WMPOCXEvents_PlayStateChangeEvent) Handles
ocxPlayer.PlayStateChange
' dependiendo del estado del reproductor
Select Case
e.newState
Case WMPLib.WMPPlayState.wmppsPlaying
' si reproduciendo
'...(código que hace algo)
Case WMPLib.WMPPlayState.wmppsStopped
' si detenido
'...(código que hace algo)
End
Select
End Sub
- El evento Tick del control
Timer (Timer1) se configura para poder mostrar
el tiempo de canción transcurrido contando los segundos pero aumentando
en 1 el número de minutos cada vez que se superan los 59 segundos:
Dim
tiempo As DateTime
' para el tiempo transcurrido
Private
Sub Timer1_Tick(ByVal
sender As System.Object,
ByVal e As
System.EventArgs) Handles Timer1.Tick
' Código para el cronómetro del tiempo
del programa
' Variables para mostrar el tiempo
Dim Minutos,
Segundos As Integer
' Variable
Segundos = diferencia en segundos entre una hora y la hora actual
Segundos = DateDiff(DateInterval.Second,
tiempo, DateTime.Now)
Minutos = Segundos \ 60
' Para que no supere 59
Segundos = Segundos - (Minutos * 60)
' Presentación
formateada del tiempo transcurrido
lbTime.Text = Format(Minutos,
"00") & ":"
& Format(Segundos, "00")
End Sub
- Los botones de control del reproductor
asocian su evento Click a métodos de Ctlcontrols,
propiedad del control OCX:
' Botón de
Play
Private Sub
btPlay_Click(ByVal sender
As System.Object,
ByVal e As
System.EventArgs) Handles btPlay.Click
ocxPlayer.Ctlcontrols.play() ' reproducir
End Sub
' Para tocar la canción anterior
Private Sub
btPrev_Click(ByVal sender
As System.Object,
ByVal e As
System.EventArgs) Handles btPrev.Click
ocxPlayer.Ctlcontrols.previous() ' anterior
End Sub
' Para tocar la siguiente canción
Private Sub
btNext_Click(ByVal sender
As System.Object,
ByVal e As
System.EventArgs) Handles btNext.Click
ocxPlayer.Ctlcontrols.next()
' siguiente
End Sub
' Botón que detiene el reproductor
Private Sub
btStop_Click(ByVal sender
As System.Object,
ByVal e As
System.EventArgs) Handles btStop.Click
ocxPlayer.Ctlcontrols.stop() ' detener
reproducción
End Sub
- Para abrir archivos se emplea un procedimiento
definido en un bloque separado, en él se filtran por código las extensiones
de archivo:
' Para abrir el cuadro
de diálogo
Private Sub
btAbrir_Click(ByVal sender
As System.Object,
ByVal e As
System.EventArgs) Handles btAbrir.Click
abrirArchivo()
End Sub
' Procedimiento para
abrir un archivo
Private
Sub abrirArchivo()
' presentar al usuario un cuadro de diálogo
Dim openFile As
New OpenFileDialog
' mostrar solamente archivos M3U y MP3
openFile.Filter = "Listas de canciones (*.m3u)|*.m3u|Archivos
Mpeg Layer 3 (*.mp3)|*.mp3"
' si elegimos algún archivo
If openFile.ShowDialog() = DialogResult.OK
Then
' abrir el archivo elegido en el reproductor
ocxPlayer.URL = openFile.FileName
End If
End Sub
- Para mostrar el código del programa en
un segundo formulario, se crea una variable nueva para contener a ese formulario
Form2 y se llama al método ShowDialog() para
que el formulario mostrado sea modal (debe cerrarse u ocultarse para
que el usuario pueda continuar trabajando con el resto de la aplicación):
' Para mostrar el segundo formulario con el código
Private Sub lbCode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbCode.Click
Dim code As New Form2 ' crear una nueva instancia de la clase formulario
code.ShowDialog() ' mostrar el formulario
End Sub
8 - Utilidad
de la aplicación:
Con este programa
reproduzco de manera habitual listas de MP3 creadas desde Winamp o el propio
Windows Media Player 9. Las clases aquí utilizadas tienen muchas características
no empleadas todavía, entre ellas manejo y edición de Playlists, obtención de
mayor información sobre el archivo reproducido, etc.
Programadores con más experiencia pueden hacer un programa mucho más completo,
aquí solamente se ha intentado mostrar cómo, sin necesidad de tener conocimientos
avanzados en Visual Basic .NET, es factible crear aplicaciones a priori
tan complejas como un reproductor de archivos multimedia.
9 -
Imagen del programa en funcionamiento:

10 - Código del programa:
Pulsa aquí para ver el código
completo.