当前位置:   article > 正文

C#winForm键盘事件_c# 键盘

c# 键盘

这篇日志记录下最近用到的WinForm的键盘事件。

这个其实不是很难理解,通常我之前使用的键盘事件都是绑定在按钮上的,keypress。

但是我这里将其绑定到窗体上,就可实现,按下对应的键,做对应的事情。

但是需要注意,需要将该窗体的keypreview属性设置为true!!!

不要小看键盘事件,他还是有很多需要注意的地方的。

1:分类

键盘事件分三种,KeyDown、KeyPress、KeyUp。执行的顺序就如我写的顺序相同。

这里需要注意一个问题:

KeyDown触发后,不一定触发KeyUp,当KeyDown 按下后,拖动鼠标,那么将不会触发KeyUp事件。

2:定义

KeyDown:在控件有焦点的情况下按下键时发生。

KeyPress:在控件有焦点的情况下按下键时发生。(下面会说和KeyDown 的区别)

KeyUp:在控件有焦点的情况下释放键时发生。

3:KeyPress 和KeyDown 、KeyPress之间的区别

KeyPress主要用来捕获数字(注意:包括Shift+数字的符号)、字母(注意:包括大小写)、小键盘等除了F1-12、SHIFT、Alt、Ctrl、Insert、Home、PgUp、Delete、End、PgDn、ScrollLock、Pause、NumLock、{菜单键}、{开始键}和方向键外的ANSI字符


KeyDown 和KeyUp 通常可以捕获键盘除了PrScrn所有按键(这里不讨论特殊键盘的特殊键)

KeyPress 只能捕获单个字符

KeyDown 和KeyUp 可以捕获组合键。通常使用KeyUp

KeyPress 可以捕获单个字符的大小写

KeyDown和KeyUp 对于单个字符捕获的KeyValue 都是一个值,也就是不能判断单个字符的大小写。

KeyPress 不区分小键盘和主键盘的数字字符。

KeyDown 和KeyUp 区分小键盘和主键盘的数字字符。

其中PrScrn 按键KeyPress、KeyDown和KeyUp 都不能捕获。

KeyPress与KeyDown、KeyUp事件的区别:

1:KeyPressEventArgs类的主属性(KeyPress事件的一个参数类型)
(1).Handle属性:用来获取或设置一个值,该值指示是否处理过KeyPress事件。


(2).KeyChar属性:用来获取按下的键对应的字符,通常是该键的ASCII玛(返回的是键盘的值,如按‘K‘返回就是K)。

2:KeyEventArgs类的主属性(KeyUp和KeyDown事件的一个参数)
(1).Alt属性:用来获取一个值,该值提示是否曾按下了Alt键


(2).Control属性:用来获取一个值,该值提示是否曾按下了Crtl键


(3).Shift属性:用来获取一个值,该值提示是否曾按下了Shift键


(4).Handle属性:用来获取一个值,该值提示是否曾处理过此事件


(5).KeyCode属性:以Keys枚举值返回键盘键的键码,该属性不包含修改键信息,用于测试指定的键盘键


(6).KeyData属性:以Keys枚举值返回键盘键的键码,该属性包含修改键信息,用于判断按下键的所有信息(可返回组合键)


(7).KeyValue属性:以整数形式返回键码,而不是Keys枚举类型值。用于获得所按下键的数字表示


(8).Modifiers属性:以Keys枚举值返回所按下的修改键,仅判断修改键的信息

我这里要做一个上下左右箭头的功能,通过键盘和鼠标都可以对其进行控制。那么KeyPress事件便被排除在外,为了稳定,我这里选择了KeyDown事件,但是我发现我这个选择是错误的,上下左右键可以激活KeyUp事件,不能激活KeyDown事件,需要重写ProcessDialogKey方法来支持上下左右键对KeyDown事件的支持,其余两种事件也会有例子展示。

废话 不多说,上代码:(文末有实例,可下载)

首先Load事件中将KeyPreview属性设置为true,也可以在窗体的属性中设置。

  1. /// <summary>
  2.         /// 加载事件
  3.         /// </summary>
  4.         private void Form1_Load(object sender, EventArgs e)
  5.         {
  6.             //获取或设置一个值,该值指示在将键事件传递到具有焦点的控件前,窗体是否将接收此键事件。
  7.             this.KeyPreview = true;
  8.         }

定义四个按钮,赋予其点击事件:

  1. /// <summary>
  2.         /// 上箭头事件
  3.         /// </summary>
  4.         private void button1_Click(object sender, EventArgs e)
  5.         {
  6.             MessageBox.Show("我点击了上箭头");
  7.         }
  8.  
  9.         /// <summary>
  10.         /// 下箭头事件
  11.         /// </summary>
  12.         private void button4_Click(object sender, EventArgs e)
  13.         {
  14.             MessageBox.Show("我点击了下箭头");
  15.         }
  16.  
  17.         /// <summary>
  18.         /// 右箭头事件
  19.         /// </summary>
  20.         private void button3_Click(object sender, EventArgs e)
  21.         {
  22.             MessageBox.Show("我点击了右箭头");
  23.         }
  24.  
  25.         /// <summary>
  26.         /// 左箭头事件
  27.         /// </summary>
  28.         private void button2_Click(object sender, EventArgs e)
  29.         {
  30.             MessageBox.Show("我点击了左箭头");
  31.         }

效果如下图所示:

微信截图_20190923225452.png

上边只是实现了点击事件的绑定,下边我们来实现键盘事件,我们这里使用的是KeyDown事件,分别使用ASCII及键值来获取按下的键。代码如下:

  1. /// <summary>
  2.         /// 按键按下事件
  3.         /// </summary>
  4.         private void Form1_KeyDown(object sender, KeyEventArgs e)
  5.         {
  6.             // 键码获取
  7.             if ((Keys)e.KeyCode == Keys.Left)
  8.             {
  9.                 button2_Click(nullnull);
  10.             }
  11.             else if ((Keys)e.KeyCode == Keys.Right)
  12.             {
  13.                 button3_Click(nullnull);
  14.             }
  15.             else if ((Keys)e.KeyCode == Keys.Up)
  16.             {
  17.                 button1_Click(sender, e);
  18.             }
  19.             else if ((Keys)e.KeyCode == Keys.Down)
  20.             {
  21.                 button4_Click(sender, e);
  22.             }
  23.             // 键值获取
  24.             if (e.KeyValue == 37)
  25.             {
  26.                 button2_Click(nullnull);
  27.             }
  28.             else if (e.KeyValue == 39)
  29.             {
  30.                 button3_Click(nullnull);
  31.             }
  32.             else if (e.KeyValue == 38)
  33.             {
  34.                 button1_Click(sender, e);
  35.             }
  36.             else if (e.KeyValue == 40)
  37.             {
  38.                 button4_Click(sender, e);
  39.             }
  40.         }

一定要重写这个方法,否则,上下左右按键不激活KeyDown事件。

  1. /// <summary>
  2.         /// 重写此方法,让其支持上下左右键
  3.         /// </summary>
  4.         /// <param name="keyData"></param>
  5.         /// <returns></returns>
  6.         protected override bool ProcessDialogKey(Keys keyData)
  7.         {
  8.             if (keyData == Keys.Up || keyData == Keys.Down || keyData == Keys.Left || keyData == Keys.Right)
  9.             {
  10.                 return false;
  11.             }
  12.             else
  13.             {
  14.                 return base.ProcessDialogKey(keyData);
  15.             }
  16.         }

        

KeyPress事件:我这里绑定的是WSAD键:

  1. /// <summary>
  2.         /// 按键事件(按键事件)
  3.         /// </summary>
  4.         private void Form1_KeyPress(object sender, KeyPressEventArgs e)
  5.         {
  6.             // 键码获取
  7.             if ((Keys)e.KeyChar == Keys.W)
  8.             {
  9.                 MessageBox.Show("我点击了W键");
  10.             }
  11.             else if ((Keys)e.KeyChar == Keys.S)
  12.             {
  13.                 MessageBox.Show("我点击了S键");
  14.             }
  15.             else if ((Keys)e.KeyChar == Keys.A)
  16.             {
  17.                 MessageBox.Show("我点击了A键");
  18.             }
  19.             else if ((Keys)e.KeyChar == Keys.D)
  20.             {
  21.                 MessageBox.Show("我点击了D键");
  22.             }
  23.         }

KeyUp事件:我这里绑定的是F1、F2、F3、F4键。

  1. /// <summary>
  2.         /// 按键抬起事件
  3.         /// </summary>
  4.         private void Form1_KeyUp(object sender, KeyEventArgs e)
  5.         {
  6.             // 键码获取
  7.             if ((Keys)e.KeyCode == Keys.F1)
  8.             {
  9.                 button2_Click(nullnull);
  10.             }
  11.             else if ((Keys)e.KeyCode == Keys.F2)
  12.             {
  13.                 button3_Click(nullnull);
  14.             }
  15.             else if ((Keys)e.KeyCode == Keys.F3)
  16.             {
  17.                 button1_Click(sender, e);
  18.             }
  19.             else if ((Keys)e.KeyCode == Keys.F4)
  20.             {
  21.                 button4_Click(sender, e);
  22.             }
  23.         }

以上就是基本的键盘事件的一些需要注意的地方及实例,如果在调试过程中,打断点发现对应的按键不能进入方法中,那么就是对应的方法不支持这个按键。换个方法试试就好。

有好的建议,请在下方输入你的评论。

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/50401
推荐阅读
相关标签
  

闽ICP备14008679号