C# winfrom实际开发中,有时需要程序去监听用户按下了键盘的那些键,我们可以设置窗体的KeyDown事件,在里面捕捉键盘按键。
后台代码:
[C#] 纯文本查看 复制代码 private void frmMain_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Up)
{
_direction = ModelEnum.Direction.Up;
}
else if (e.KeyCode == Keys.Down)
{
_direction = ModelEnum.Direction.Down;
}
else if (e.KeyCode == Keys.Left)
{
_direction = ModelEnum.Direction.Left;
}
else if (e.KeyCode == Keys.Right)
{
_direction = ModelEnum.Direction.Right;
}
}
我们需要将窗体的KeyPreview属性设置为true,然后才会执行该事件。
但是如果我们要监听键盘的上下左右四个按键时,实际操作中会发现,这样设置完成之后,点击这几个键根本就触发不了keydown事件。后来百度了一下,终于找到了原因:
方向键是作为系统键来处理的,默认方向键的作用是移动焦点,系统处理完了就不会将键盘的键值传递个窗体或获取焦点的控件,也不会触发窗体的KeyDown事件。 在没有控件的时候没有其他的控件可以移动焦点,系统不处理,这才会将键值传递给窗体,触发KeyDown事件 解决方法:
在窗体的.cs文件里面重写默认的系统键处理方式,遇到方向键,则直接返回,系统不处理,这样键值就会被传递到窗体,触发KeyDown事件 [C#] 纯文本查看 复制代码 protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Up || keyData == Keys.Down ||
keyData == Keys.Left || keyData == Keys.Right)
return false;
else
return base.ProcessDialogKey(keyData);
} 如此成功解决,可以正常监听键盘的方向按键了。
|