0

目前我正在使用 Windows 窗体应用程序中的钢琴。我所做的是,当您按下键盘上的某个键时,它会发出声音(从技术上讲,它会强制按下按钮)。现在我想做的是添加,当用户按下一个键以及按下 shift 键时,它会播放更长的声音。例如,如果按下 A 键,它将播放 C 和弦的声音,如果按下 A + 按下 shift 键,它将播放更长版本的声音。这是按键的代码和播放声音的示例:

private bool shiftPressed = false;
const int NOTE_LENGTH = 500;

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    switch (keyData)
    {
        case Keys.A://C
            C_Low.BackColor = Color.Gray;
            C_Low.PerformClick();
            break;
        case Keys.S://D
            D_Low.BackColor = Color.Gray;
            D_Low.PerformClick();
            break;
        case Keys.D://E
            E_Low.BackColor = Color.Gray;
            E_Low.PerformClick();
            break;
        case Keys.F://F
            F_Low.BackColor = Color.Gray;
            F_Low.PerformClick();
            break;
        case Keys.G://F
            G_Low.BackColor = Color.Gray;
            G_Low.PerformClick();
            break;
        case Keys.H://A
            A_Low.BackColor = Color.Gray;
            A_Low.PerformClick();
            break;
        case Keys.J://B
            B_Low.BackColor = Color.Gray;
            B_Low.PerformClick();
            break;
        case Keys.W://C#
            C_Diez_Low.BackColor = Color.Gray;
            C_Diez_Low.PerformClick();
            break;
        case Keys.E://D#
            D_Diez_Low.BackColor = Color.Gray;
            D_Diez_Low.PerformClick();
            break;
        case Keys.T://F#
            F_Diez_Low.BackColor = Color.Gray;
            F_Diez_Low.PerformClick();
            break;
        case Keys.Y://G#
            G_Diez_Low.BackColor = Color.Gray;
            G_Diez_Low.PerformClick();
            break;
        case Keys.U://A#
            A_Diez_Low.BackColor = Color.Gray;
            A_Diez_Low.PerformClick();
            break;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

例如C_Low_Click_1事件:

private void C_Low_Click_1(object sender, EventArgs e) //Play C low
{
    if (shiftPressed)
    {
        C_Low.BackColor = Color.White;
        if (Low.Checked)
        {
            System.Media.SoundPlayer player = new System.Media.SoundPlayer(Properties.Resources.C_Low_Long);
            player.Load();
            player.PlaySync();
        }
        if (Med.Checked)
        {
            System.Media.SoundPlayer player = new System.Media.SoundPlayer(Properties.Resources.C_Medium_Long);
            player.Load();
            player.PlaySync();
        }
        if (High.Checked)
        {
            System.Media.SoundPlayer player = new System.Media.SoundPlayer(Properties.Resources.C_High_Long);
            player.Load();
            player.PlaySync();
        }
    }
    else
    {
        C_Low.BackColor = Color.White;
        if (Low.Checked)
        {
            System.Media.SoundPlayer player = new System.Media.SoundPlayer(Properties.Resources.C_Low);
            player.Load();
            player.PlaySync();
        }
        if (Med.Checked)
        {
            System.Media.SoundPlayer player = new System.Media.SoundPlayer(Properties.Resources.C_Medium);
            player.Load();
            player.PlaySync();
        }
        if (High.Checked)
        {
            System.Media.SoundPlayer player = new System.Media.SoundPlayer(Properties.Resources.C_High);
            player.Load();
            player.PlaySync();
        }
    }
}

任何帮助将不胜感激,如果我没有提供任何信息,请告诉我:D

4

2 回答 2

1

你应该考虑使用KeyEvents你的表单,尤其是KeyDownKeyUp事件。重要提示:要正确使用事件,您必须将KeyPreview属性设置为truefirst!

然后在KeyDown事件中使用以下代码:

shiftPressed = e.Shift;

KeyUp事件中:

shiftPressed = false;
// also possible, although I won't recommend using the code below,
// as there could be some incorrect handling if shift is pressed
// shiftPressed = e.Shift;
于 2015-05-22T17:19:23.860 回答
1

Keys是一个标志枚举,因此您可以使用以下方法测试 shift 键:

var shiftPressed = keyData.HasFlag(Keys.Shift);

当按下 shift 时,您的 switch 语句将不起作用(因为值 is not Keys.A,例如,它是Keys.Shift|Keys.A)。您可以先删除班次,这样您的 switch 语句才能工作:

var keyWithoutShift = keyData & ~Keys.Shift;

switch (keyWithoutShift) 
{ 
    // handle keys as normal
}
于 2015-05-22T17:20:11.730 回答