KeyDown事件未被调用

时间:2014-06-21 14:46:32

标签: c# .net winforms

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    // The program flow does not enter this scope.

    if (e.KeyCode == Keys.Right)
    {
    }
}

3 个答案:

答案 0 :(得分:3)

您需要将表单的KeyPreview属性设置为true

根据MSDN

  

当此属性设置为true时,表单将接收所有KeyPress,   KeyDown和KeyUp事件。表单的事件处理程序之后   完成按键操作后,按键分配到   有焦点的控制。例如,如果设置了KeyPreview属性   为true,当前选中的控件是一个TextBox,之后   keystroke由TextBox形式的事件处理程序处理   控件将收到按下的键。处理键盘   事件仅在表单级别,不允许控件接收   键盘事件,设置你的KeyPressEventArgs.Handled属性   form的KeyPress事件处理程序为true。

这可以在设计时完成,只需为Form的KeyPreview

设置true即可

或手动执行

public class Form1 : Form
{
    public Form1()
    {
        base.KeyPreview = true;
        InitializeComponent();
    }
}

答案 1 :(得分:2)

使用ProcessCmdKey覆盖:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == Keys.Right)
        System.Diagnostics.Debug.WriteLine("Right key pressed");

    return true;
}

答案 2 :(得分:0)

你可以用这个:

KeyboardState ks = new KeyboardState();
if(ks.isKeyDown(Keys.Right)
{
    System.Diagnostics.Debug.WriteLine("Right key pressed");
}

注意:这不是我的头脑,所以可能不是100%准确,但我98%确定它会起作用:)