我一直在玩一些C#并专门制作声音…because it’s fun.所以我已经将其全部工作了,但Console.Beep()却使我有些烦恼:它不会直接连接声音.例如,运行下面的代码将导致一系列250毫秒的声音突发-但不是全部同时运行并听起来好像是一个声音,而是变得脱节了,每个声音之间都有〜50ms的间隔.
for(int i = 0; i < 11; i++)
{
Console.Beep(980, 250);
}
所以问题是,是否有任何编程方式可以使系统一起运行声音?我不得不说我并不真的希望有这样的情况,但是我认为这是一个值得询问的问题,因为许多other resources似乎只是接受事实,那就是事实并非如此.
解决方法:
您不能,该方法使用内核的功能.我将证明:
[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/,您可以使用此工具并为其提供声音流,从而控制声音. (您可以创建不使用文件作为源的流)