控制台应用密钥发布

时间:2014-07-25 18:03:02

标签: c# multithreading console-application beep

我希望程序只要按下特定键就会发出蜂鸣声。 有什么方法可以在发布密钥时检测到密钥吗?然后中止播放该哔声的线程?

考虑以下示例:

   class Program
        {
        public static void Play()
        {
            while (true)
            {
                Console.Beep(400, 10000);//play for a long length, will be interrupted as soon as the key is released
            }
        }
        public static void Main(string[] args)
        {
             while(true)
             {
             ConsoleKeyInfo cki=Console.ReadKey(true);
             if(cki.Key==ConsoleKey.G)
                  {
                    Thread p = new Thread(Play);
                    p.Start();
                  }

             }
        }

我考虑使用Thread.Abort(),但它只应在释放密钥G时中止上述线程p。 实施一种在保持按下G键的同时播放短音哔声的方法不会起作用,因为在每次哔哔声之间可以听到很小的间隔。

因此,使用以下代码将发出短蜂鸣声,它们间隔很小:

public static void Main()
    {

        ConsoleKeyInfo keyinfo;
        do
        {
            keyinfo = Console.ReadKey();

            Console.Beep(400, 10);
        }
        while (keyinfo.Key == ConsoleKey.G);
    }

相反,我希望有一声长哔声,一旦释放钥匙就会停止。

3 个答案:

答案 0 :(得分:0)

这是因为当您按住某个键时,键盘每秒最多会产生约31次“击键”。这使得键击和下一次击键之间的延迟大约为32.25 ms。

现在因为Console.ReadKey阻塞了线程,你将等待这个32.25ms,然后再调用下一个Beep,这会使每个10ms的哔声产生22ms的静音。

回到代码,你应该增加嘟嘟声时间,以大致匹配击键之间的延迟。我根据SystemInformation.KeyboardSpeed准确计算了自己。如果您需要,我会添加它。

ConsoleKeyInfo keyinfo;

do
{
    keyinfo = Console.ReadKey();

    Console.Beep(400, 33);
}
while (keyinfo.Key == ConsoleKey.G);

答案 1 :(得分:0)

它比其他建议解决方案复杂得多,但我担心唯一的选择是从按下键的内容填满的声音缓冲区播放蜂鸣声......我说的是使用DirectSound API和这样的事情......也许http://msdn.microsoft.com/en-us/library/windows/desktop/bb318673(v=vs.85).aspx可以成为调查这种可能性的良好起点......

答案 2 :(得分:-2)

您编写的代码工作正常。

使用包括:

使用System.Threading;

我在任何CPU构建模式下运行Visual Studio 2010 Ultimate中的代码。

它运作正常。

从项目输出目录运行.exe文件。