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

时间:2010-06-15 10:50:46

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

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

目前我使用低音嘟嘟声来获得糟糕的结果和高音嘟嘟声以获得良好效果:

if( goodResult == true )
{
    Beep(1000, 40);
}
else
{
    Beep(2000, 20);
}

这在我的Vista笔记本电脑上运行正常,但我在其他笔记本电脑上尝试过,有些人似乎在较短时间内播放声音(听起来更像是咔嗒声而不是哔哔声)或声音根本不播放。 / p>

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

  1. 是否有更可靠的蜂鸣功能?
  2. 是否有(简单)方式我可以播放简短的.wav文件或类似的东西(首选解决方案)。

5 个答案:

答案 0 :(得分:3)

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

在例如WAV文件中创建两个音调。 Audacity,然后使用例如PlaySound

答案 1 :(得分:1)

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

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

  1. 右键点击该项目,然后选择Properties
  2. 导航至Configuration Properties -> Linker -> Input
  3. 将路径添加到要嵌入的.wav文件中(在我的情况下为$(ProjectDir)\Audio\PingSend.wav)。
  4. 要回放其中一个.wav,只需致电:

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

Windows MessageBeep功能将播放默认错误,确定或使用正确的参数提醒系统声音。因此,播放的实际声音和音量在用户的控制之下,但应该被识别为错误或OK。