VBScript使用过时MediaPlayer ProgID报错,如何更新实现后台音频播放?
解决VBScript后台播放音频时"WMPlayer.OCX.7"创建失败的问题
问题根源
WMPlayer.OCX.7这个ActiveX对象已被Windows系统弃用或移除,导致抛出800A01AD(ActiveX组件无法创建对象)错误。
替代方案
方案1:使用无版本号的WMPlayer对象
部分系统仍兼容不带版本后缀的WMPlayer.OCX对象,修改代码如下:
Set Sound = CreateObject("WMPlayer.OCX") Sound.URL = "C:\Windows\Media\Alarm01.wav" Sound.settings.volume = 100 ' 按需调整音量 Sound.Controls.play ' 等待媒体元数据加载完成 Do While Sound.currentMedia.duration = 0 WScript.Sleep 100 Loop ' 等待播放结束后退出 WScript.Sleep (Int(Sound.currentMedia.duration) + 1) * 1000 Sound.close Set Sound = Nothing
方案2:通过WScript.Shell调用系统播放器后台运行
如果方案1仍失效,直接调用系统自带的Windows Media Player,通过命令行参数实现后台播放:
Set WshShell = CreateObject("WScript.Shell") ' 参数说明:/play /close 播放完成自动关闭;/background 后台运行;0 隐藏窗口;True 等待播放结束 WshShell.Run """C:\Program Files\Windows Media Player\wmplayer.exe"" ""C:\Windows\Media\Alarm01.wav"" /play /close /background", 0, True Set WshShell = Nothing
该方案依托系统原生播放器,兼容性最强,无需依赖易弃用的ActiveX对象。
方案3:使用SAPI语音对象(仅适用于WAV音频)
如果只是播放简单的WAV文件,也可以用系统的语音合成对象间接播放:
Set voice = CreateObject("SAPI.SpVoice") Set audioFile = CreateObject("SAPI.SpFileStream") audioFile.Open("C:\Windows\Media\Alarm01.wav") voice.SpeakStream audioFile, 0 ' 0 = SVSFlagsAsync,异步播放 ' 等待播放完成 Do While voice.WaitUntilDone(100) = False WScript.Sleep 100 Loop audioFile.Close Set audioFile = Nothing Set voice = Nothing
注意事项
- 确保音频文件路径正确,脚本有读取该文件的权限
- 方案2中,若系统是32位,播放器路径需改为
C:\Program Files (x86)\Windows Media Player\wmplayer.exe
内容的提问来源于stack exchange,提问作者samcosmo
相关产品推荐
相关产品推荐

