Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0082: Wav und Midi endlos abspielen per API

 von 

Beschreibung 

Dieser Tipp macht dasselbe wie der letzte (Tipp 81) nur ohne jegliches Steuerelement. Der Sound wird per mciSendString abgespielt, wobei nach dessen Beendigung eine Callback-Routine im angefügten Modul angesprungen wird. Dies wird über das Abhören der Windowsnachrichten realisiert, sodass beim Eintreten des entsprechenden Ereignisses der Sound erneut gestartet werden kann.

Update am 23. September 2004 von Peter Eberle : Nun darf in den Ordnernamen ein Leerzeichen vorkommen.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

CallWindowProcA (CallWindowProc), GetShortPathNameA (GetShortPathName), SetWindowLongA (SetWindowLong), mciSendStringA (mciSendString)

Download:

Download des Beispielprojektes [12,02 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Optionsfeld-Steuerelement "Option1" (Index von 0 bis 1)
' Steuerelement: Schaltfläche "Command2"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Beschriftungsfeld "Label1"

Option Explicit

Private Const MAX_PATH As Long = 260&

Private Declare Function GetShortPathName Lib "kernel32" _
        Alias "GetShortPathNameA" (ByVal lpszLongPath As String, _
        ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long

Private Sub Form_Load()
    hForm = Me.hwnd
    Option1(0).Value = True
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode _
                             As Integer)
    Call MCI_Stop
End Sub

Private Sub Command1_Click()
    Call MCI_Start
End Sub

Private Sub Command2_Click()
    Call MCI_Stop
End Sub

Private Sub Option1_Click(Index As Integer)
    Dim sBuffer As String
    Dim nResult As Long
    
    Call MCI_Stop
    If Index = 0 Then
        Path = App.Path & _
            IIf(Right$(App.Path, 1) = "\", "", "\") & "\sound1.wav"
            
    Else
        Path = App.Path & _
            IIf(Right$(App.Path, 1) = "\", "", "\") & "\sound2.mid"
            
    End If
    
    sBuffer = Space(MAX_PATH)
    ' kurzen Dateinamen ermitteln
    nResult = GetShortPathName(Path, sBuffer, Len(sBuffer))
    Path = Left$(sBuffer, InStr(sBuffer, vbNullChar) - 1)
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'--------- Anfang Modul "Module1" alias Module1.bas ---------

Option Explicit

Public Declare Function mciSendString Lib "winmm.dll" _
        Alias "mciSendStringA" (ByVal lpstrCommand As _
        String, ByVal lpstrReturnString As String, ByVal _
        uReturnLength As Long, ByVal hwndCallback As Long) _
        As Long
        
Private Declare Function CallWindowProc Lib "user32" Alias _
        "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
        ByVal hwnd As Long, ByVal msg As Long, ByVal wParam _
        As Long, ByVal lParam As Long) As Long

Private Declare Function SetWindowLong Lib "user32" Alias _
        "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex _
        As Long, ByVal dwNewLong As Long) As Long

Private Const MCI_NOTIFY As Long = &H3B9&
Private Const MCI_NOTIFY_SUCCESS As Long = &H1&
Private Const GWL_WNDPROC As Long = -4&

Public Path As String
Public hForm As Long
Private hPWnd As Long
Private Repeat As Boolean

Public Sub MCI_Start()
    If Not Repeat Then
        hPWnd = SetWindowLong(hForm, GWL_WNDPROC, AddressOf chkMCI)
        Repeat = True
    End If
    
    Call mciSendString("close " & Path, 0&, 0&, 0&)
    Call mciSendString("open " & Path, 0&, 0&, hForm)
    Call mciSendString("play " & Path & " notify", 0&, 0&, hForm)
End Sub

Public Sub MCI_Stop()
    Call mciSendString("close " & Path, 0&, 0&, 0&)
    
    If Repeat Then
        Call SetWindowLong(hForm, GWL_WNDPROC, hPWnd)
        Repeat = False
    End If
End Sub

Function chkMCI(ByVal hwnd As Long, ByVal uMsg As Long, _
                ByVal wParam As Long, ByVal lParam As Long) As Long
  
    If uMsg = MCI_NOTIFY And wParam = MCI_NOTIFY_SUCCESS Then
        Call MCI_Start
    End If
    
    chkMCI = CallWindowProc(hPWnd, hwnd, uMsg, wParam, lParam)
End Function
'---------- Ende Modul "Module1" alias Module1.bas ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 4 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Chrisibuu am 24.02.2004 um 09:51

Klar geht das, musst diese nur in die Ressourcendatei miteinkompilieren.

Bis Bald!
Chrisibuu

Kommentar von claude am 22.01.2004 um 12:05

Kann man eine .mid nicht irgendwie in die exe mit einbauen ??

Kommentar von Sebastian am 08.07.2002 um 10:15

Hi, der Tipp funktioniert unter XP und VB6 man muß nur statt
dieser Zeile :
Call MCI_Stop
If Index = 0 Then
Path = App.Path & "\sound1.wav"
Else
Path = App.Path & "\sound2.mid"
End If
diese Zeile einfügen ... :
Call MCI_Stop
If Index = 0 Then
Path = "sound1.wav"
Else
Path = "sound2.mid"
End If
viel Spass
Gruß Sebastian

Kommentar von Alex Krebs am 17.03.2001 um 12:02

Super Code, funktioniert klasse, aber man kann ihn nicht nutzen um im Hintergrund midis abzuspielen weil das System unglaublich langsam wird! gibts da eine andere Möglichkeit?
Gruß Alex