Страницы: 1
RSS
Системный звук критической ошибки
 
Здравствуйте уважаемые форумчане.  
 
Пытаюсь симитировать звук при открытии сообщения критической ошибки.  
Подключаю API функцию:  
 
Declare Function MessageBeep& Lib "user32" (ByVal wType As Long)  
 
и в нужном месте  
 
MessageBeep& (MB_ICONHAND)  
 
НО... Не так все просто - выдает стандартный звук. Где ошибка?  
 
 
Заранее благодарен,  
 
Владимир.
 
{quote}{login=VovaK}{date=13.12.2010 01:46}{thema=Системный звук критической ошибки}{post}Пытаюсь симитировать звук...критической ошибки{/post}{/quote}  
На аватаре видно :)
 
Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszName As String, ByVal dwFlags As Long) As Long  
 
Sub bb()  
Call sndPlaySound("C:\Windows\Media\Windows XP Critical Stop.wav", 1)  
End Sub  
 
Если у Вас не ХР - вставьте соотв. путь к файлу.
 
Огромное спасибо за подсказку, но у этого решения есть один существенный минус - локальность. Пути, названия файла могут быть индивидуальными.
 
1. Можно брать путь отсюда:  
HKEY_USERS\.DEFAULT\AppEvents\Schemes\Apps\.Default\SystemExclamation\.Default    
2. Можно включить файл в проект - скажем, на отдельном листе в ячейках побайтно. При открывании книги записывать в %temp% и воспроизводить оттуда.
 
1. Поправка  
HKEY_USERS\.DEFAULT\AppEvents\Schemes\Apps\.Default\SystemHand\.Default
 
" Можно включить файл в проект - скажем, на отдельном листе в ячейках побайтно. При открывании книги записывать в %temp% и воспроизводить оттуда."  
 
Можно об этом поподробнее,никак не мог представить что звуковой файл  
возможно записять в ячейки листа
 
В первом приближении так  
 
Option Explicit  
Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszName As String, ByVal dwFlags As Long) As Long  
 
Sub GetFile()  
Dim i As Long, b As Byte, iRow As Long, iCol As Long  
Open "C:\Windows\Media\Windows XP Critical Stop.wav" For Binary As #1  
Application.ScreenUpdating = False  
With Worksheets.Add  
iRow = 1  
iCol = 1  
For i = 1 To LOF(1)  
   Get 1, , b  
   .Cells(iRow, iCol) = b  
   iCol = iCol + 1  
   If iCol > 256 Then iCol = 1: iRow = iRow + 1  
Next  
End With  
Close #1  
Application.ScreenUpdating = True  
End Sub  
 
Sub Save_Play_Delete_File()  
 
Dim c As Range, b As Byte  
Open Environ("temp") & "\Windows XP Critical Stop.wav" For Binary As #1  
For Each c In ActiveSheet.UsedRange  
   If IsEmpty© Then Exit For  
   b = c  
   Put 1, , b  
Next  
Close #1  
 
sndPlaySound Environ("temp") & "\Windows XP Critical Stop.wav", 1  
Application.Wait Now + #12:00:01 AM#  
Kill Environ("temp") & "\Windows XP Critical Stop.wav"  
End Sub
 
А если сразу брать расположение и название файла из реестра, то, наверное, так:  
 
Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszName As String, ByVal dwFlags As Long) As Long  
 
Sub PlayCritialStopSound()  
Dim iRegValue As String, WshShell As Object, iCorrectPath As String  
   Set WshShell = CreateObject("WScript.Shell")  
   iRegValue = WshShell.RegRead("HKEY_USERS\.DEFAULT\AppEvents\Schemes\Apps\.Default\SystemHand\.Default\")  
   'MsgBox iRegValue  
   iCorrectPath = Replace(iRegValue, "%SystemRoot%", Environ("WinDir"))  
   'MsgBox iCorrectPath  
   Call sndPlaySound(iCorrectPath, 1)  
End Sub  
 
P.S. Проверить не могу, т.к. на работе отсутствуют колонки и спикер отключен
 
Не умножайте сущностей :)  
 
iCorrectPath = Replace(iRegValue, "%SystemRoot%", Environ("SystemRoot"))
 
Вроде, они одинаковы  
 
   MsgBox Environ("SystemRoot")  
   MsgBox Environ("WinDir")  
 
SystemRoot - 22-й индекс Environ, а windir - 30-й  
 
Разницы не нашёл )
 
Красиво...
 
PlayCritialStopSound от Somebody выдает звук ошибки.  
 
Ув.Казанский, может что не так делаю.  
 
Сначала запускаю процедуруGetFile  
затем Save_Play_Delete_File  
на строке  
sndPlaySound Environ("temp") & "\Windows XP Critical Stop.wav", 1  
выдает просто beep,звука ошибки нет
 
Пришёл, домой, у меня тут Windows 7. Тут другая ветка реестра. Нужно так  
 
'Windows 7  
Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszName As String, ByVal dwFlags As Long) As Long  
 
Sub PlayCritialStopSound()  
Dim WshShell As Object, iRegKey As String  
   Set WshShell = CreateObject("WScript.Shell")  
   iRegKey = "HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default\SystemHand\.Default\"  
   Call sndPlaySound(Replace(WshShell.RegRead(iRegKey), "%SystemRoot%", Environ("WinDir")), 1)  
End Sub
 
Somebody  
В Win2000 работает и так, и так. Смотреть в HKEY_CURRENT_USER, конечно, более правильно.  
 
WW  
> Сначала запускаю процедуруGetFile  
Правильно. Вы видите новый лист с числами?  
Проверьте путь к файлу в Вашей системе. В Win2000 путь к этому файлу  
"C:\Winnt\Media\chord.wav"  
 
> затем Save_Play_Delete_File  
Эта процедура берет данные с активного листа, т.е. активным должен быть новый лист с числами.  
 
Собственно, для системных звуков подходит метод, разработанный Somebody. Имеет смысл сохранять в книге свои звуки, DLL и т.п.
 
Понял,спасибо
Страницы: 1
Читают тему
Наверх