【问题标题】:Detecting when the user is pressing the shift key检测用户何时按下 shift 键
【发布时间】:2015-05-23 01:29:28
【问题描述】:

目前我正在 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

【问题讨论】:

标签: c# visual-studio-2010 audio piano


【解决方案1】:

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

然后在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;

【讨论】:

    【解决方案2】:

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

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

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

    var keyWithoutShift = keyData & ~Keys.Shift;
    
    switch (keyWithoutShift) 
    { 
        // handle keys as normal
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      • 2012-09-03
      • 2010-10-05
      • 1970-01-01
      • 2021-04-04
      相关资源
      最近更新 更多