C# 未调用KeyDown事件

C# 未调用KeyDown事件,c#,.net,winforms,C#,.net,Winforms,使用ProcessCmdKey覆盖: private void Form1_KeyDown(object sender, KeyEventArgs e) { // The program flow does not enter this scope. if (e.KeyCode == Keys.Right) { } } 使用ProcessCmdKey覆盖: private void Form1_KeyDown(object sender, KeyEventAr

使用
ProcessCmdKey
覆盖:

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

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

使用
ProcessCmdKey
覆盖:

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

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

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

根据MSDN

当此属性设置为true时,窗体将接收所有按键, KeyDown和KeyUp事件。在窗体的事件处理程序 完成对击键的处理后,将击键分配给 该控件具有焦点。例如,如果设置了KeyPreview属性 设置为true,并且当前选择的控件是文本框,位于 击键由TextBox表单的事件处理程序处理 控件将接收已按下的键。操作键盘 事件仅在窗体级别,不允许控件接收 键盘事件,设置键盘中的KeyPressEventArgs.Handled属性 窗体的按键事件处理程序设置为true

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

或者手动操作

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

    return true;
}

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

根据MSDN

当此属性设置为true时,窗体将接收所有按键, KeyDown和KeyUp事件。在窗体的事件处理程序 完成对击键的处理后,将击键分配给 该控件具有焦点。例如,如果设置了KeyPreview属性 设置为true,并且当前选择的控件是文本框,位于 击键由TextBox表单的事件处理程序处理 控件将接收已按下的键。操作键盘 事件仅在窗体级别,不允许控件接收 键盘事件,设置键盘中的KeyPressEventArgs.Handled属性 窗体的按键事件处理程序设置为true

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

或者手动操作

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

    return true;
}
你可以用这个:

public class Form1 : Form
{
    public Form1()
    {
        base.KeyPreview = true;
        InitializeComponent();
    }
}
注意:这是我脑子里想不出来的,所以可能不是100%准确,但我98%确信它会起作用:)

你可以用这个:

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


注意:这是我的想法,所以可能不是100%准确,但我98%确信它会工作:)

嗯,如果调试没有调用事件。如果是这样,请检查eUwe Keim,不确定注释是否指
If
范围而不是方法范围。您的编辑可能会改变问题的性质,因此我将其还原,直到OP提供更多上下文。请参阅@Theodoroschatziganakis同意!嗯,如果调试没有调用事件。如果是这样,请检查eUwe Keim,不确定注释是否指
If
范围而不是方法范围。您的编辑可能会改变问题的性质,因此我将其还原,直到OP提供更多上下文。请参阅@Theodoroschatziganakis同意!我已经设置好了,同样的问题@user3763059确保KeyDown事件已连接:
this.KeyDown+=Form1\u KeyDown或简单地使用覆盖:
受保护的覆盖void OnKeyDown(KeyEventArgs e){}
。完成了-在表单设计代码this.KeyDown+=new System.Windows.Forms.KeyEventHandler(this.Form1\u KeyDown)中@user3763059我更新了答案。我已经设置好了,同样的问题@user3763059确保KeyDown事件已连接:
this.KeyDown+=Form1\u KeyDown或简单地使用覆盖:
受保护的覆盖void OnKeyDown(KeyEventArgs e){}
。完成了-在表单设计代码this.KeyDown+=new System.Windows.Forms.KeyEventHandler(this.Form1\u KeyDown)中@user3763059我更新了答案。仍然不工作,不幸的是同样的问题@用户3763059-我建议您遵循此答案。仍然不工作,不幸的是同样的问题@用户3763059-我建议您遵循此答案。