基本的WinForm KeyDown事件处理

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

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

有任何想法吗 ?

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

 this.Focus(); 

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

编辑

正如您所发现的那样,真正的问题是箭头键不被视为输入键。 要解决此问题,您需要创建一个inheritance您要使用的控件的新类。 然后,重写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 。

根据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,并且看到我已经覆盖了Up,Down,Left和Right键的默认行为,按钮控制不再循环焦点,而是返回true,将控制权转移回main形成。 从这里开始,如果按下后续键(向上,向下,向左或向右),表单将操作相应的处理程序。

使用Control.GetNextControl和Set Focus来返回它。

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

将其设置为true

或者,您可能希望覆盖ProcessKeyPreview