Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2010, 19:22   #1
Олег*
Пользователь
 
Регистрация: 07.01.2010
Сообщений: 30
По умолчанию Программное воспроизведение звуков

Подскажите, пожалуйста, как в макросах приложений MS Office воспроизводить звуки при наступлении различных событий.
Там есть контролька "Windows Media Player". Я добавляю к проекту пользовательскую форму, "кидаю" эту контрольку на форму, в ее свойствах устанавливаю звуковой файл, который надо воспроизводить, а что дальше-то? Как заставить "играть", когда надо и замолкать, когда надо? При программировании на VB5 и VB6 имеются команды MediaPlayer.Play и MediaPlayer.Stop. Точно уже не помню, но, кажется, именно так. А здесь он эти команды не понимает. Как им руководить-то?

Можно, конечно, использовать API-функцию PlaySound, но там я "не дружу" с флагами

Спасибо!
Олег* вне форума Ответить с цитированием
Старый 23.02.2010, 00:12   #2
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

А какая проблема с флагами PlaySound ?
Если он равен 0, то приложение будет ждать, пока звук не закончится если он равен 1, то приложение будет реагировать на действия пользователя, даже если звук не закончился и т.д. cм MSDN
Cм так же:
http://support.microsoft.com/kb/158140
http://support.microsoft.com/kb/201543
http://www.emanual.ru/download/www.eManual.ru_54.html
Кроме того на www.un4seen.co.uk можно найти bass.dll c кучей функций и
примеров использования

Последний раз редактировалось Aent; 23.02.2010 в 00:22.
Aent вне форума Ответить с цитированием
Старый 23.02.2010, 19:55   #3
Олег*
Пользователь
 
Регистрация: 07.01.2010
Сообщений: 30
По умолчанию

Aent, спасибо за ответ.
Но всё-таки, если уж использовать API-функции, то мне не понятно следующее: как в одном параметре Флага передать сразу несколько значений?! Как я понимаю, это делается при помощи оператора OR, но у меня не укладывается в голове, как можно параметр в формате Long передавать таким вот способом:

Код:
' функция воспроизведения звукового файла
Private Declare Function PlaySound Lib "winmm.dll" _
Alias "PlaySoundA" (ByVal lpszSoundName As String, _
ByVal hModule As Long, ByVal uFlags As Long) As Long
' lpszSoundName - имя файла или другой идентификатор,
' hModule - номер модуля прикладной программы, содержащей звук
' (если данный параметр не требуется, то ему устанавливается
' значение 0),
' uFlags - флаги спецификации воспроизводимого файла,
' например:
' SND_ALIAS = &H10000 - воспроизведение системного звука,
' SND_ASYNC = &H1 - асинхронное воспроизведение, т. е.
' приложение не ждет завершения воспроизведения звука, а
' параллельно продолжает работу,
' SND_FILENAME = &H20000 - указание полного пути к файлу,
' SND_LOOP = &H8 - воспроизведение файла по кругу до тех пор,
' пока не будет вызвана команда остановки
' воспроизведения звука,
' SND_NODEFAULT = &H2 - в случае, если указанный файл
' не найден, не проигрывается стандартный звук Windows,
' SND_PURGE = &H40 - остановка воспроизведения всех звуков,
' при этом поле lpszSoundName должно быть пусто (""),
' SND_SYNC = &H0 - синхронное воспроизведение, т. е.
' приложение ожидает завершения воспроизведения звука,
' прежде чем продолжить работу, и др.

Const SND_ALIAS = &H10000
Const SND_ASYNC = &H1
Const SND_FILENAME = &H20000
Const SND_LOOP = &H8
Const SND_NODEFAULT = &H2
Const SND_PURGE = &H40
Const SND_SYNC = &H0

'Здесь я пропустил большой кусок кода и оставил только ту часть,
'которая воспроизводит звуковой файл при наступлении события Timer. 


' сигнал от таймера
Private Sub Timer1_Timer()

'''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''

   ' воспроизведение звука:
      Call PlaySound(CStr(CurDir) + "\ringer.wav", 0, _
                     SND_FILENAME Or SND_ASYNC)
      ' Call PlaySound("SystemStart", 0, _
      '                SND_ALIAS Or SND_ASYNC) -
      ' пример воспроизведения системного звука Запуск Windows
      ' (звук, соответствующий этому событию в Звуковой схеме
      ' Windows)

'''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''


End Sub
Помогите, пожалуйста, разобраться!

Функция ожидает параметра в виде числа, а ей "пихают" два числа, связанных оператором ИЛИ. Она их оба "заглатывает" что ли, я понять не могу? Таким способом можно сразу несколько параметров передавать? Хитрый способ такой что ли?

Последний раз редактировалось Олег*; 23.02.2010 в 19:57.
Олег* вне форума Ответить с цитированием
Старый 23.02.2010, 21:51   #4
Олег*
Пользователь
 
Регистрация: 07.01.2010
Сообщений: 30
По умолчанию

Кто знает, объясните, пожалуйста, как это "работает"?

Код на Листе1 в Excel:
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
  Call Proba(3 Or 9)
End Sub

Sub Proba(F As Integer)
 MsgBox (F)
End Sub
Теперь когда изменяем значение любой ячейки на Листе1, выскакивает сообщение с цифрой 11. Почему именно 11?
Олег* вне форума Ответить с цитированием
Старый 23.02.2010, 21:58   #5
Олег*
Пользователь
 
Регистрация: 07.01.2010
Сообщений: 30
По умолчанию

А, до меня дошло... Это, наверно, побитовое сложение или что-то в этом роде!

Ну значит и в случае передачи параметров они тоже "пакуются в один флакон" таким же способом! Правильно я думаю?

Последний раз редактировалось Олег*; 23.02.2010 в 22:03.
Олег* вне форума Ответить с цитированием
Старый 23.02.2010, 23:41   #6
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Да. ИЛИ (OR) - это побитовое сложение, И (AND) - побитовое умножение
и т.д.
Aent вне форума Ответить с цитированием
Старый 25.02.2010, 13:33   #7
Олег*
Пользователь
 
Регистрация: 07.01.2010
Сообщений: 30
По умолчанию

Ну вот я написал на Листе1 приблизительный кусок кода, который должен воспроизводить звук непрерывно (по кругу), когда пользователь вставляет в любую ячейку цифру 1 и останавливать воспроизведение, когда будет напечатан ноль. А все другие цифры игнорируем. На диске C: должен быть какой-нибудь коротенький Wav-файл под именем 01.WAV.
Ну а дальше всё работает вот так: когда печатаю разные цифры кроме 1, молчание, Когда впечатываю куда-нибудь единицу, начинает "верещать"
Но остановить эти "душераздирающие звуки" ни впечатыванием нуля, ни командой BREAK, ни CTRL+BREAK невозможно! Он будет верещать до тех пор, пока не закрыть Excel, в котором создан макрос.

Вопрос: как мне программно заставить его замолчать?

Код:
' функция воспроизведения звукового файла
Private Declare Function PlaySound Lib "winmm.dll" _
Alias "PlaySoundA" (ByVal lpszSoundName As String, _
ByVal hModule As Long, ByVal uFlags As Long) As Long

Const SND_ALIAS = &H10000
Const SND_ASYNC = &H1
Const SND_FILENAME = &H20000
Const SND_LOOP = &H8
Const SND_NODEFAULT = &H2
Const SND_PURGE = &H40
Const SND_SYNC = &H0

Private Sub Worksheet_Change(ByVal Target As Range)

Select Case Target
    Case 1 ' Воспроизводим звук по кругу.
        Call PlaySound("C:\01.WAV", 0, _
        SND_FILENAME Or SND_ASYNC Or SND_LOOP)
    Case 0 ' Выключаем звук.
        Call PlaySound("", 0, SND_PURGE)
    Case Else
      ' Ничего не делаем!
End Select

End Sub

Последний раз редактировалось Олег*; 25.02.2010 в 13:36.
Олег* вне форума Ответить с цитированием
Старый 25.02.2010, 14:01   #8
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Попытка не пытка!

Попробуй
Код:
Or SND_ASYNC
убрать.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 25.02.2010, 14:47   #9
Олег*
Пользователь
 
Регистрация: 07.01.2010
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Sasha_Smirnov Посмотреть сообщение
Попробуй
Код:
Or SND_ASYNC
убрать.
Убрал!
Но в таком виде:
Код:
    Case 1 ' Воспроизводим звук по кругу.
        Call PlaySound("C:\01.WAV", 0, _
        SND_FILENAME Or SND_LOOP)
звук почему-то воспроизводится однократно... А мне бы хотелось, чтобы он воспроизводился именно по кругу и асинхронно (чтобы не мешал работе программы, а только предупреждал меня о наступлении определённых событий, когда надо).
Олег* вне форума Ответить с цитированием
Старый 25.02.2010, 15:16   #10
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Для прекращения воспроизведения зацикленного ассинхронного звука вызовите
Код:
Call PlaySound(vbNullString, 0,0)

Последний раз редактировалось Aent; 25.02.2010 в 16:16. Причина: Вместо VbNullChar должно быть VbNullString
Aent вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Воспроизведение нескольких звуков одновременно GodSmack Общие вопросы Delphi 3 13.08.2009 02:28
Сравнение звуков MakarovAlv Помощь студентам 1 26.06.2009 16:13
Склеивание звуков varvara16 Мультимедиа в Delphi 24 14.11.2008 18:24
Диаграммы звуков Kor Мультимедиа в Delphi 1 30.09.2008 22:43