2014-11-01 142 views
3

我一直在玩弄一些C#并专门制作声音...... because it's fun。所以我已经完成了所有的工作,但是有些东西让我烦恼Console.Beep():它不直接连接声音。例如,运行下面的代码会产生一系列250毫秒的声音突发 - 但不是所有声音都在一起运行,听起来就像是一个声音,它们会变得不连贯,每个声音之间会停顿约50ms。连接Console.Beep声音的方法

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

所以现在的问题是,是否有任何编程方式,使系统运行的声音混合在一起?我不得不说,我真的不希望那里有,但我认为这是值得一问,因为许多otherresources似乎只是接受它没有的事实。

+0

'Console.Beep'不是C#的一部分# – 2014-11-01 19:58:28

+0

@JohnSaunders - 没有意识到。感谢编辑 – ArtOfCode 2014-11-01 19:58:49

+0

C#编程语言和.NET Framework是两个不同的东西。 – 2014-11-01 20:00:17

回答

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/,你可以用这个工具控制你的声音,并给它流。 (您可以创建不使用文件作为源的流)