返回列表 回复 发帖

[贴士] 在脚本中播放声音

在从零开始学起时,在我硬盘上一些曾经帮助我很多的小纸条!--Sz

您可以搜遍 VBScript文档,但是您无法找到任何方法可让您通过脚本直接播放声音,即便只是“吱吱”声也办不到。或者,在这种情况下可能是“嘀嘀”声。

因此,必须调用另一个实用程序,以便播放声音。要是声音文件采用 .WAV 格式,最好使用 Windows 录音机。对于这一点,至少有两个理由。首先,录音机较为小巧,可以非常快地进行加载;Media Player 要强大得多,但是对于只是播放“嘀嘀”声,太大材小用了。其次,通过传递适当的命令行参数,可以隐式运行录音机;因此,您(或用户)将听到声音,但不会在屏幕上看到录音机。

以下脚本可以播放 Notify.wav(在 Windows\Media 文件夹下找到的一个标准的操作系统声音文件):

VBS strSoundFile = "C:\Windows\Media\Notify.wav"
VBS Set objShell = CreateObject("Wscript.Shell")
VBS strCommand = "sndrec32 /play /close " & chr(34) & strSoundFile & chr(34)
VBS objShell.Run strCommand, 0, True

该脚本的前两行非常简单。在第一行中,我们将该文件路径指派给了 strSoundFile 变量;在第二行中,我们创建了 Wscript Shell 对象(将用于实际运行录音机的对象)的一个实例。

第三行稍微麻烦一点。为了从命令提示符运行录音机,需要键入该命令:

sndrec32 /play /close "C:\Windows\Media\Notify.wav"
前两个命令行参数告诉录音机播放该文件,然后自动终止;当然,第三个参数就是所要播放的文件的名称。在该例中,不需要对文件路径加双引号;只有当路径名中含有空格时,才需要加引号。我们预先加了引号,以便为您提供模板,供您在播放路径名中确实含有空格的声音文件时使用。因此:

sndrec32 /play /close "C:\Windows\Media\Windows XP Error.wav"
为了对该文件路径加双引号,我们使用了 Chr(34) 命令(可在字符串中插入双引号)。因此,这行代码将 sndrec32 /play /close、前双引号 (“) 文件 C:\Windows\Media\Notify.wav 以及后双引号 (”) 串在了一起:

strCommand = "sndrec32 /play /close " & chr(34) & strSoundFile & chr(34)
最后,在第四行中使用了 Run 方法,传递刚才构建的命令字符串。参数 0 可以让录音机在隐藏窗口中运行;参数 True 告诉该脚本等到声音播放结束后,再重新进行播放。

那么,至于在弹出消息框的同时播放声音,您会发现这几乎不可能;这是因为,录音机需要一两秒的时间来加载并开始播放。最好做两件事。首先,在调用录音机时,使用参数 False;这将告诉该脚本启动录音机并无需等到声音播放结束后就可以继续播放。

其次,使用 Wscript.Sleep 命令将脚本暂停大约一秒钟;从而让录音机有时间进行加载,幸运的话,大约会在弹出消息框时开始播放该声音。能否恰好在弹出消息框的同时播放声音呢?一般不会。但至少可以接近于同时进行。

这里有一个示例脚本也可以大约在弹出消息框的同时播放声音:

VBS strSoundFile = "C:\windows\Media\Notify.wav"
VBS Set objShell = CreateObject("Wscript.Shell")
VBS strCommand = "sndrec32 /play /close " & chr(34) & strSoundFile & chr(34)
VBS objShell.Run strCommand, 0, False
VBS Wscript.Sleep 1000
VBS Msgbox "A problem has occurred."
简单就好!
謝謝,收藏到我的腳本中
楼主貌似是管理员。 有几点我可以提一下吗? Windows NT 系统。在没有声音文件的时间 是可以通过脚本直接播放声音,只是声音不是很好听,比如下面用AU3制作的一个 <两子老虎>的音乐文件。就一个脚本,运行就可以听到歌曲。


Func frequency($scale,$melody="C")
If $scale="0" Then Return 0
If $melody="C" Then
Switch $scale
Case "1"
  Return 264
Case "2"
  Return 297
Case "3"
  Return 330
Case "4"
  Return 352
Case "5"
  Return 396
Case "6"
  Return 440
Case "7"
  Return 495
EndSwitch
ElseIf $melody="D" Then
Switch $scale
Case "1"
  Return 297
Case "2"
  Return 334
Case "3"
  Return 371
Case "4"
  Return 396
Case "5"
  Return 446
Case "6"
  Return 495
Case "7"
  Return 557
EndSwitch
EndIf
SetError(1)
EndFunc

Func book($book,$speed=500,$melody="c")
For $s=1 To StringLen($book)
$frequency=frequency(StringMid($book,$s,1),$melody)
If @error Then ContinueLoop
$Duration=$speed
Switch StringMid($book,$s+1,1)
Case "H"
  $frequency=frequency(StringMid($book,$s,1),$melody)*2
Case "L"
  $frequency=frequency(StringMid($book,$s,1),$melody)/2
Case "Q"
  $Duration=$speed/2
Case "S"
  $Duration=$speed*2
EndSwitch
If $frequency=0 Then
Sleep($speed)
Else
Beep($frequency,$Duration)
EndIf
Next
EndFunc

book("12311231345034505Q6Q5Q4Q315Q6Q5Q4Q3126L1026L1",300,"D")




还有  当弹出消息框的同时播放声音 也是可以实现, 用MSGBOS弹出消息框的之前先播放文件,用APD来暂停播放,当消息框被激活时,播放。所以这也可以实现。

Windows的系统都安装有 Windows Media Player  所以。想要实现在不打开播放器的情况下,播放指定的音频文件,是直接用Windows Media Player  自带的命令可以实现。
例下:
start "C:\Program Files\Windows Media Player\wmplayer.exe" /min "C:\1.mp3"

用start打开 Windows Media Player 用min参数 来播放 C盘下的1.mp3文件。 而且还是隐藏的。

[ 本帖最后由 jneyxwry 于 2007-12-19 00:12 编辑 ]
+10

评分记录

  • SzAngel

感谢楼上的指正
还是同样的问题,代码是使用在按键精灵中的,所以只支持按键精灵的VBS
另外播放一声提示声启动Windows Media Player将会在程序运行时很卡的,系统录音机能解决的问题为什么要用庞大的Windows Media Player呢?
简单就好!
谢谢楼上的指出。
返回列表