我应该用啥来替换 WinAPI Beep() 函数?

Posted

技术标签:

【中文标题】我应该用啥来替换 WinAPI Beep() 函数?【英文标题】:What should I use to replace the WinAPI Beep() function?我应该用什么来替换 WinAPI Beep() 函数? 【发布时间】:2010-06-15 10:50:46 【问题描述】:

我有一个 Visual C++/CLI 应用程序,它使用哔声来表示结果的好坏(在用户看不到屏幕时使用)。

目前,我使用低音哔哔声表示不良结果,使用高音哔声表示良好结果:

if( goodResult == true )

    Beep(1000, 40);

else

    Beep(2000, 20);

这在我的 Vista 笔记本电脑上运行良好,但我已经在其他笔记本电脑上尝试过,有些似乎播放声音的时间更短(听起来更像是咔哒声而不是哔哔声)或者根本不播放声音。

所以我在这里有两个问题:

    有更可靠的蜂鸣功能吗? 有没有一种(简单的)方法可以播放短的 .wav 文件或类似的文件(首选解决方案)。

【问题讨论】:

相关:blogs.msdn.com/b/larryosterman/archive/2010/01/04/… 【参考方案1】:

Beep 功能传统上使用 PC 扬声器,我猜它现在或多或少已经过时了。我猜该功能是由笔记本电脑的 Bios 处理的,因此取决于硬件。我建议你改用 PC:s 声卡播放声音。

创建两个音调作为 WAV 文件,例如Audacity,然后使用例如播放它们PlaySound.

【讨论】:

这很有效,虽然声音从不相互播放,所以如果一个在另一个之前开始,第一个被切断。我猜这是 PlaySound 实现的限制? 通过阅读文档,我会说 SND_NOSTOP 是您想要的,也可能与 SND_ASYNC 一起使用(取决于您是否要等待声音结束)。 你完全正确! '这是一个复制/粘贴错误,但很好发现 :-)【参考方案2】:

根据 Krumelur 的回答,我得到了一个相当简洁的解决方案,它将 .wav 嵌入到可执行文件中。它使用SoundPlayer 而不是PlaySound 函数。

对于 Visual C++ / CLI 项目,添加嵌入式资源似乎与 .net 支持的其他语言略有不同:

    右键单击项目并选择Properties。 导航到Configuration Properties -> Linker -> Input。 将路径添加到要嵌入的 .wav 文件(在我的例子中为 $(ProjectDir)\Audio\PingSend.wav)。

播放 .wav 的简单调用之一:

System::IO::Stream^ s = Assembly::GetExecutingAssembly()->GetManifestResourceStream("PingSend.wav");
System::Media::SoundPlayer^ pingPlayer = gcnew System::Media::SoundPlayer(s);
pingPlayer->Play();

..应该在新线程中播放声音。

【讨论】:

【参考方案3】:

也许语音合成可能是合适的,不确定,我假设您的用户是盲人。

http://msdn.microsoft.com/en-us/library/system.speech.synthesis.speechsynthesizer.aspx

【讨论】:

不,不是盲人,只是在发出哔哔声的机器的视线范围之外,所以语音不太好。它必须是短而尖锐的声音(哔声目前为 20/40 毫秒长)。【参考方案4】:

Windows MessageBeep 函数将使用正确的参数播放默认错误、OK 或警告系统声音。因此,实际播放的声音和音量由用户控制,但应该可以识别为错误或正常。

【讨论】:

我需要两个不同的哔声,理想情况下它在所有系统上都相同,因此这可能不是最佳解决方案。【参考方案5】:

看起来可能有a solution using the winmm library。

【讨论】:

以上是关于我应该用啥来替换 WinAPI Beep() 函数?的主要内容,如果未能解决你的问题,请参考以下文章

我可以用啥来替换嵌套的异步回调?

我应该用啥来构建我的 Angular 2 项目?

我应该用啥来比较 DBNull ?使用 DBNull.Value 或 ToString().IsNullOrEmpty()

在android中每隔几分钟我应该用啥来读取json?

在我的 Qt 应用程序中,我可以用啥来代替 sleep 和 usleep?

我缺少啥来阻止 Beep 在我的 Mac 10.5.8 上响起(使用 MonoDevelop 2.8.8.2)?