Другие языки программирования и технологии

Help! С функцией PlaySound на С#!!! Как остановить воспроизведение при нажатии на кнопку? Какие параметры должны быть???

MN
Mukim Nozimov
492
Если используется неуправляемый код из winmm.DLL, то я помочь не смогу. Но могу предложить альтернативу - использовать класс System.Media.SoundPlayer.
Создаём объект от этого класса конструктором без параметров, для смены звука назначаем свойство SoundLocation, для проигрывания используем метод Play(), для остановки - Stop(). На сколько я понял, в winmm.DLL тоже поддерживается только формат .wav, поэтому разницы в функциональности не будет.
Сергей Чижиков
Сергей Чижиков
2 321
Лучший ответ
Остановить воспроизведение можно повторно вызвав функцию и передав ей вместо имени файла пустую строку.
Хотя я бы порекомендовал для воспроизведения звука и музыки использовать другую АПИ-функцию.
Главное отличие - mciSendString может воспроизводить одновременно звук и музыку в фоне.
Воспроизводить может даже с середины файла.
Вот примерчик на VB.NET Думаю с переводом на С# проблем не будет.

Public Class Form1

'*** Декларируем API функции ***
' Воспроизведение звука и музыки
Private Declare Function mciSendString Lib "winmm.dll" _
Alias "mciSendStringA" (ByVal lpstrCommand As String, _
ByVal lpstrReturnString As String, ByVal uRetrunLength _
As Long, ByVal hwndCallback As Long) As Long

' Преобразование длинного имени файла в короткое (8.3) имя.
Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" _
(ByVal lpszLongPath As String, ByVal lpszShortPath As String, _
ByVal cchBuffer As Integer) As Int32

' Загрузка формы
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Задаем каталог (звуки, курсор, музыка и проч... )
Dim Directory As String = Application.StartupPath & "\Sound\"
Dim FileName As String ' путь к файлу

'Грузим звуки и музыку в MCI
FileName = ShortFilePath(Directory & "1.mid") ' фоновая музыка
mciSendString("open " & FileName & " alias Фон", "", 0, 0)

FileName = ShortFilePath(Directory & "CLICK.WAV") ' перзарядка патронов
mciSendString("open " & FileName & " alias Патроны", "", 0, 0)

' Воспроизводим фон
mciSendString("play Фон", "", 0, 0)
End Sub

' Перезарядка патронов
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' Воспроизводим звук перезарядки патронов
mciSendString("play Патроны from 0", "", 0, 0)
End Sub

' Остановка воспроизведения
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
mciSendString("stop Фон", "", 0, 0)
End Sub

'* Функция преобразования пути к файлу (длинный в короткий)
Private Function ShortFilePath(ByVal strFilePath As String) As String
Dim ShortFileName As String = Space(256) ' буфер для короткого имени
Dim Result As Int32 = GetShortPathName(strFilePath, ShortFileName, Len(ShortFileName))
ShortFilePath = Microsoft.VisualBasic.Left(ShortFileName, Result)
End Function

End Class