Cerrar proceso Windows Media cuando termina la reproducción

Tengo una función que recorre una tabla y coge la dirección url del fichero que quiero reproducir. La reproducción se ejecuta correctamente, pero WMP sigue abierto y no se inicia la reproducción del siguiente fichero hasta que no cierro manualmente WMP.

Este es el proceso que utilizo.

'función para ejecutar windows media player en opción de lista de reproducción
Public Sub ExecCmd(Pathname As String, Optional WindowStyle As Long)
Dim proc As PROCESS_INFORMATION
Dim start As STARTUPINFO
Dim ret As Long
' Initialize the STARTUPINFO structure:
With start
.cb = Len(start)
If Not IsMissing(WindowStyle) Then
.dwFlags = STARTF_USESHOWWINDOW
.wShowWindow = WindowStyle
End If
End With
' Start the shelled application:
ret& = CreateProcessA(0&, Pathname, 0&, 0&, 1&, _
NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)
' Wait for the shelled application to finish:
ret& = WaitForSingleObject(proc.hProcess, INFINITE)
ret& = CloseHandle(proc.hProcess) **************************AQUI ES DONDE FALLA, PORQUE NO CIERRA EL PROCESO
End Sub

Imagino que el parámetro INFINITE es el "culpable" de ello pero, ¿Hay alguna forma de forzar el cierre de WMP?

2 Respuestas

Respuesta
2

Pruebe llamando esta función al iniciar la reproducción.

Public Function Pausa(NumeroDeSegundos As Variant)
On Error GoTo Err_Pausa
Dim TiempoPausa As Variant, inicio As Variant
TiempoPausa = NumeroDeSegundos
inicio = Timer
Do While Timer < inicio + TiempoPausa
DoEvents
Loop
Exit_Pausa:
Exit Function
Err_Pausa:
MsgBox Err.Number & " - " & Err.Description, vbCritical, "Pause()"
Resume Exit_Pausa
End Function

Llamela como:

Pasuse(5) después de iniciar los videros, cambie el 5 por otros valores. Personalmente utilizo otra alternativa.

Le muestro este ejemplo como lo hago

Puedo reproducir 1 video haciendo doble clic sobre el cuadro de lista o puedo reproducir todos haciendo clic en Reproducir Todos. Le muestro solo el código del evento Todos.

Código evento Al hacer clic

Private Sub Todos_Click()
On Error Resume Next
Dim player As WindowsMediaPlayer
Dim VideoDone As String
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT idvideo, video FROM tblvideos ORDER BY idvideo")
Do Until rs.EOF
  Me.miplayer.URL = CurrentProject.Path & "\Videos\" & rs!video
   VideoDone = "No"
   Pausa 5
       Do While VideoDone = "No"
        Pausa 2
        If miplayer.playState = wmppsStopped Then VideoDone = "Yes"
       Loop
  rs.MoveNext
Loop
miplayer.Close
End Sub

Código de la función pausa()

Public Function Pausa(NumeroDeSegundos As Variant)
On Error GoTo Err_Pausa
Dim TiempoPausa As Variant, inicio As Variant
TiempoPausa = NumeroDeSegundos
inicio = Timer
Do While Timer < inicio + TiempoPausa
 DoEvents
Loop
Exit_Pausa:
Exit Function
Err_Pausa:
MsgBox Err.Number & " - " & Err.Description, vbCritical, "Pause()"
Resume Exit_Pausa
End Function

Esto me funciona perfectamente en Access 2016.

Respuesta
1

Si Ret& devuelve el ID de la tarea, se la puede matar antes de dar comienzo la siguiente ya que el mismo reproductor no admite mas de una sesión concurrente (pero asumo que si admite una lista de reproducción).

Supongo que tendrá su aplicación practica (y si en lugar de INFINITE se le da tiempo para una breve muestra, posiblemente seria lo correcto).

En mi libre opinión, Access tendría su aplicación practica a la hora de crear la lista a reproducir (para eso la muestra) y enviarla al reproductor, en lugar de intentar que Access sea una parte del reproductor.

Eso es lo que intento hacer, matar el proceso antes de dar comienzo la siguiente, pero no la mata.

************* ESTE ES EL CODIGO QUE USO PARA RECORRER LA LISTA DE REPRODUCCION

Private Sub ReproLista_Click()
Dim dbs As Database
Dim rst As Recordset
Dim busca As String

RutaLista = RutaCarpeta("Listas") & Me.ReproLista & "\"
busca = "SELECT Listas_Ficheros.Direccion_Fichero "
busca = busca & "FROM Listas_Ficheros "
busca = busca & "WHERE Listas_Ficheros.Nombre_Lista like '" & Forms![Buscar_Musica]!ReproLista & "';"
Set dbs = CurrentDb
Set rst = CurrentDb.OpenRecordset(busca)
rst.MoveFirst
Do Until rst.EOF

'''ejecuta Windows Media de la canción. El uno final es para que la ventana de MDP se vea, si no se quiere 0
ExecCmd "C:\Program Files\Windows Media Player\wmplayer.exe """ & rst!Direccion_Fichero & """", 1

rst.MoveNext
Loop
End Sub

Quizás no quedo clara mi propuesta, la lista de reproducción seria la del reproductor (si admite una canción, probablemente admita un bloque de datos).

Desde Access la reproducción tendrá que hacerse de una en una y si hay que poner un tiempo habrá que obtener ese dato de cada pieza musical (el tamaño no es un dato veraz a no ser que todas las piezas tengan el mismo nivel de codificación).

Yo lo planteo así: una cosa es crear una lista y otra 'pasar lista'

Access crea la lista y el reproductor 'la pasa'.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas