基本的WinForm KeyDown事件处理

时间:2010-11-23 06:40:32

标签: c# winforms event-handling keydown

我正在使用WinForms。我已经为主窗体的KeyDown事件创建了一个事件处理程序,从而调用了一个按钮的Click事件处理程序。

调用的Click事件处理程序取决于按下的特定键。如果用户单击该按钮而不是使用该键,然后随后尝试使用该键,则该键(例如向下箭头)用作制表符循环,在表单上的每个按钮控件之间更改焦点(而不是执行Keydown处理程序)。

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

问题是,按钮在单击时具有焦点,因此后续按键不会被表单本身捕获,而是由按钮捕获。在按钮的单击事件处理程序中,将焦点放在以下表单:

this.Focus();

这样,焦点就会恢复到表单中,因此表单会监听按键事件。

修改

正如您所发现的那样,真正的问题是箭头键不会被视为输入键。要解决此问题,您需要创建一个继承您要使用的控件的新类。然后,您覆盖IsInputKey方法以将箭头键视为输入键。请检查此链接:http://bytes.com/topic/c-sharp/answers/517530-trapping-arrow-keys-usercontrol。本文也很有用:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.isinputkey.aspx

答案 1 :(得分:2)

根据SimpleCoder,我必须覆盖Button类的IsInputKey成员。

public class ControlButton : Button
{
    protected override bool IsInputKey(Keys keyData)
    {
        if (keyData == Keys.Up)
        {
            return true;
        }
        else if (keyData == Keys.Down)
        {
            return true;
        }
        else if (keyData == Keys.Left)
        {
            return true;
        }
        else if (keyData == Keys.Right)
        {
            return true;
        }
        else
        {
            return base.IsInputKey(keyData);
        }
    }
}

然后我需要使用这个新类来实例化我的按钮对象(在设计器类中),如下所示:

    private ControlButton btnDown;
    private ControlButton btnRight;
    private ControlButton btnLeft;
    private ControlButton btnUp;

    this.btnDown = new ControlButton();
    this.btnRight = new ControlButton();
    this.btnUp = new ControlButton();
    this.btnLeft = new ControlButton();

接下来,我为每个新按钮对象注册了OnClick个处理程序,如下所示:

    this.btnUp.Click += new System.EventHandler(this.btnUp_Click);

    private void btnUp_Click(object sender, EventArgs e)
    {            
        MessageBox.Show("Up");
    }

(等)

并为主要表单注册了KeyDown处理程序:

    this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.frmUavController_KeyDown);

    private void frmUavController_KeyDown(object sender, KeyEventArgs e)
    {
        if ((e.KeyCode == Keys.Up) || (e.KeyCode == Keys.W))
        {
            btnUp.PerformClick();
        }
        else if ((e.KeyCode == Keys.Down) || (e.KeyCode == Keys.S))
        {
            btnDown.PerformClick();
        }
        else if ((e.KeyCode == Keys.Left) || (e.KeyCode == Keys.A))
        {
            btnLeft.PerformClick();
        }
        else if ((e.KeyCode == Keys.Right) || (e.KeyCode == Keys.D))
        {
            btnRight.PerformClick();
        }
    }

将主窗体属性KeyPreview设置为true,并且看到我已经覆盖了向上,向下,向左和向右键的默认行为,按钮控制不再循环焦点,而是返回true ,将控制权转回主表格。从这里开始,如果按下后续键(向上,向下,向左或向右),表单将操作相应的处理程序。

答案 2 :(得分:0)

使用Control.GetNextControl并将焦点设置为它返回的内容。

答案 3 :(得分:0)

查看KeyPreview属性。 http://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview.aspx

将其设为true

或者您可能希望覆盖表单的ProcessKeyPreview