【问题标题】: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 笔记本电脑上运行良好,但我已经在其他笔记本电脑上尝试过,有些似乎播放声音的时间更短(听起来更像是咔哒声而不是哔哔声)或者根本不播放声音。

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

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

【问题讨论】:

标签: wpf windows audio c++-cli beep


【解决方案1】:

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

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

【讨论】:

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

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

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

  1. 右键单击项目并选择Properties
  2. 导航到Configuration Properties -> Linker -> Input
  3. 将路径添加到要嵌入的 .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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-13
      • 2010-11-05
      • 2010-12-06
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多