密钥关闭时播放音调C#

时间:2016-03-12 15:43:45

标签: c# keypress keydown beep

我正在构建一个钢琴控制台应用程序,在特定时间内以特定频率播放哔哔/音调。救命 只要按下键,最后就会播放音调。 P.S最终一次播放几个音调

namespace something
{

 public class piano
 {

  [DllImport("kernel32.dll")]
  static extern bool Beep(uint dwFreq, uint dwDuration);

  public static void  Main (string [] args)
    {

     Console.WriteLine("This is a piano.");

  //The following code is wrong but you get the idea
     char x = KeyDown;
     switch(x)

     case "q":
     Beep(523,500);
     break;

     case "w":
     Beep(587,500);
     break;

     //etc

     default:
     break;
   }
  }
 }

1 个答案:

答案 0 :(得分:0)

在控制台应用程序中,您可以检测何时按下了某个键,但是在它被释放时却没有。因此我会使用WinForms应用程序。

在WinForms表单中,您可以在表单级别使用KeyDownKeyUp事件。要激活它们,您必须将表单的KeyPreview属性设置为true。您可以在属性窗口或代码中执行此操作。

然后你必须记住按下了哪些键。我正在使用HashSet<Keys>

// Stores the keys in pressed state.
private HashSet<Keys> _pressedKeys = new HashSet<Keys>();

// Used in DisplayKeys method.
private StringBuilder _sb = new StringBuilder();

// Form constructor
public frmKeyboard()
{
    InitializeComponent();
    KeyPreview = true; // Activate key preview at form level.
}

private void frmKeyboard_KeyDown(object sender, KeyEventArgs e)
{
    // Each time a key is pressed, add it to the set of pressed keys.
    _pressedKeys.Add(e.KeyCode);
    DisplayKeys();
}

private void frmKeyboard_KeyUp(object sender, KeyEventArgs e)
{
    // Each time a key is released, remove it from the set of pressed keys.
    _pressedKeys.Remove(e.KeyCode);
    DisplayKeys();
}

private void DisplayKeys()
{
    _sb.Clear();
    foreach (Keys key in _pressedKeys.OrderBy(k => k)) {
        _sb.AppendLine(key.ToString());
    }
    label1.Text = _sb.ToString();
}

现在,您可以一次按一个或多个键,它们将显示在标签中。

简单的Beep方法不会让您同时播放声音。有关可能的解决方案,请参阅MSDN上的此主题:Playing Sounds Simultaneously。另一种选择可能是MIDI.NET