一种连接Console.Beep声音的方法

时间:2014-11-01 19:53:34

标签: c# audio beep

我一直在玩一些C#,专门发出声音...... because it's fun。所以我已经完成了所有工作,但是有些事情与我Console.Beep()有关:它没有直接连接声音。例如,运行下面的代码将导致一系列250毫秒的声音突发 - 但不是所有声音一起运行并听起来好像是一个声音,它们会脱节,每个声音之间会有约50毫秒的暂停。 / p>

for(int i = 0; i < 11; i++)
{
    Console.Beep(980, 250);
}

所以问题是,是否有任何程序化方法让系统一起运行声音?我不得不说我真的没想到会有,但我认为值得一提,因为很多other resources似乎只是接受了事实并非如此。

1 个答案:

答案 0 :(得分:3)

你不能,该方法使用内核的功能。我会证明:

[SecuritySafeCritical]
[HostProtection(SecurityAction.LinkDemand, UI = true)]
public static void Beep(int frequency, int duration)
{
    if (frequency < 37 || frequency > 32767)
    {
        throw new ArgumentOutOfRangeException("frequency", frequency, Environment.GetResourceString("ArgumentOutOfRange_BeepFrequency", new object[]
        {
            37,
            32767
        }));
    }
    if (duration <= 0)
    {
        throw new ArgumentOutOfRangeException("duration", duration, Environment.GetResourceString("ArgumentOutOfRange_NeedPosNum"));
    }
    Win32Native.Beep(frequency, duration);
}

这是Console.Beep的代码,它使用Win32Native.Beep来实际执行蜂鸣声(除了上面的检查),该方法会导致:

[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool Beep(int frequency, int duration);

从内核导入的函数。

除非您对内核进行硬编码和修改,否则您无法做到。 (我相信你不想这样做)

我可以为您提供另一种选择:http://naudio.codeplex.com/,您可以通过使用此工具并为其提供流来控制您的声音。 (您可以创建不使用文件作为源的流)