在Control.KeyUp事件上检测Alt键时出现问题

时间:2010-02-09 03:03:37

标签: c# events keyboard

我有一个KeyDown和KeyUp事件的控件,如下所示。我遇到的问题是KeyDown中的'x'为TRUE,而KeyUp中的'x'总是为FALSE。我正在尝试检测Alt键(您可能已经猜到了)。

有没有我不知道的gottcha。我的意思是,当我按下Alt时它会检测到它没问题,但是在keyup上它是错误的。

任何建议/想法

由于

    private void MyControl_KeyDown(object sender, KeyEventArgs e)
    {
        bool x;
        x = ((int) (e.KeyData & Keys.Alt) != 0);
        x = (e.KeyData & Keys.Alt) == Keys.Alt;
        x = e.Alt;
    }
    private void MyControl_KeyUp(object sender, KeyEventArgs e)
    {
        bool x;
        x = ((int) (e.KeyData & Keys.Alt) != 0);
        x = (e.KeyData & Keys.Alt) == Keys.Alt;
        x = e.Alt;
    }

3 个答案:

答案 0 :(得分:6)

您是否尝试检测Alt + [letter]事件?是这样,试试这个:

        private void YourControl_KeyDown(object sender, KeyEventArgs e)
        {
          if((e.Alt) & (e.KeyCode  == Keys.X))
          {
            MessageBox.Show("Alt-X pressed");
          }
        }

对于只有Alt,请尝试:

    private void YourControl_KeyDown(object sender, KeyEventArgs e)
    { 
        if (e.KeyCode  == Keys.Menu)
        {
            //YourCode
            e.Handled = true;
        }
    }

    private void YourControl_KeyUp(object sender, KeyEventArgs e)
    { 
        if (e.KeyData == Keys.Menu)
        {
            //YourCode
            e.Handled = true;
        }
    }

答案 1 :(得分:1)

我希望你不只是在你的类中设置一个bool成员变量来响应按下Alt键。

如果您想在执行代码时知道Alt键是否关闭以响应其他事件(例如鼠标事件),请使用Control.ModifierKeys属性,因为它更可靠。它还意味着您没有冗余成员变量。

如果你实际上试图检测用户是否只按下了一个修改键,那么@ bluecoder的解决方案可能就是你想要的。

答案 2 :(得分:1)

如果要检测实键按下(Alt或任何其他键),则可以使用此代码。此代码适用于KeyUp,KeyDown和其他关键事件

private void YourControl_KeyDown(object sender, KeyEventArgs e)
{
   Key _key = e.Key != Key.System ? e.Key : e.SystemKey;
   // _key is your real pressed key
}