基本的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
。