KeyPress、KeyDown、KeyUp事件&&KeyCode、KeyChar、KeyData

1.KeyPress、KeyDown和KeyUp的区别

(一)键事件按下列顺序发生:

   1.

      KeyDown
   2.

      KeyPress
   3.

      KeyUp

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

 (三)定义

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

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

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

 (四)KeyPress 和KeyDown 、KeyPress之间的区别

 1.KeyPress主要用来捕获数字(注意:包括Shift+数字的符号)、字母(注意:包括大小写)、小键盘等除了F1-12、SHIFT、Alt、Ctrl、Insert、Home、PgUp、Delete、End、PgDn、 ScrollLock、Pause、NumLock、{菜单键}、{开始键}和方向键外的ANSI字符 KeyDown 和KeyUp 通常可以捕获键盘除了PrScrn所有按键(这里不讨论特殊键盘的特殊键)

2.KeyPress 只能捕获单个字符KeyDown 和KeyUp 可以捕获组合键。

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

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

5.KeyPress 不区分小键盘和主键盘的数字字符。KeyDown 和KeyUp 区分小键盘和主键盘的数字字符。

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

(五)系统组合键的判定

在使用键盘的时候,通常会使用到CTRL+SHIFT+ALT 类似的组合键功能。对于此,我们如何来判定?

通过KeyUp 事件能够来处理(这里说明一下为什么不用KeyDown,因为在判定KeyDown的时候,CTRL、SHIFT和ALT 属于一直按下状态,然后再加另外一个键是不能准确捕获组合键,所以使用KeyDown 是不能准确判断出的,要通过KeyUp 事件来判定 )

 

1.KeyDown 事件

  KeyDown事件在首次按下某个键时发生。

  示例  KeyDown事件的使用

  本示例中,判断用户是否按下特殊键,如果是,则显示在窗体的标题栏上。

  程序主要代码如下。

    private void textBox1_KeyDown(object sender, KeyEventArgs e)

    {

       string G_str_Mode = "";

      string G_str_text = e.KeyCode + ":" + e.Modifiers + ":" + e.KeyData + ":" + "(" + e.KeyValue + ")";

      if (e.Shift == true)

        G_str_Mode = "Shift 键被按下";

      if (e.Control == true)

        G_str_Mode = "Ctrl 键被按下";

      if (e.Alt == true)

        G_str_Mode = "Alt 键被按下";

      this.Text = G_str_text + G_str_Mode;

    }

  注意:上面的代码中,KeyDown事件取得了一个KeyEventArgs对象e,并返回相关的按键信息,KeyEventArgs参数提供数个属性值,这些属性根据键盘上被按下的按键返回对应值。KeyEventArgs参数的属性值如表所示。

  表   KeyEventArgs属性值
属性值     说明
Control     获取一个值,该值指示是否曾按下Ctrl键
KeyCode     获取KeyDown或KeyUp事件的键盘代码
KeyData     获取KeyDown或KeyUp事件的键数据
KeyData     获取KeyDown 或KeyUp事件的键数据
KeyValue     获取KeyDown或KeyUp事件的键盘值
Modifiers     获取KeyDown或KeyUp事件的修饰符标志。这些标志指示按下的Ctrl、Shift 和Alt键的组合
Shift     获取一个值,该值指示是否曾按下Shift键

 2.Keyup事件

 Keyup事件在释放键时发生。

 示例 Keyup事件的使用

 本示例实现的是,当程序运行的时候,按完键盘后,自动设置窗体的大小。

 程序主要代码如下。

  private void frmKeyDownUP_KeyUp(object sender, KeyEventArgs e)

  

    {

      this.ClientSize = new System.Drawing.Size(800,100);

    }

 

以上 totally copy from:

http://blog.sina.com.cn/s/blog_5e3a1bbb0100esv3.html

 

以下 totally copy from:

http://hi.baidu.com/jianshao810/blog/item/d3ca9a4365eff1149213c672.html

 

2.KeyCode,KeyChar 和KeyValue的区别:

KeyPress事件

KeyPressEventArgs参数

Handled /是否处理过KeyPress事件

KeyChar //按下的键对应的字符

如果I,则keychar为i,如果shift+i,则 keychar为I。

如果是Ctrl+I,或ALt+I,根本不会得到一个 keypress事件,因为他们是特殊的键序列,并非通过KeyPress发送。

需要KeyDown

KeyDown

KeyEventArgs参数

   Alt 获取一个值,该值指示是否曾按下 Alt 键。

   Control 获取一个值,该值指示是否曾按下 Ctrl 键。

   Handled 获取或设置一个值,该值指示是否处理过此事件。

   KeyCode 获取 KeyDown 或 KeyUp 事件的键盘代码。

   KeyData 获取 KeyDown 或 KeyUp 事件的键数据。

   KeyValue 获取 KeyDown 或 KeyUp 事件的键盘值。

   Modifiers 获取 KeyDown 或 KeyUp 事件的修饰符标志。这些标志指示按下的 Ctrl、Shift 和 Alt 键的组合。

   Shift 获取一个值,该值指示是否曾按下 Shift 键。

SuppressKeyPress 获取或设置一个值,该值指示键事件是否应传递到基础控件。

如果同时按下了Ctrl+Shift+I

KeyData   Keys.Ctrl+Keys。Shift+Keys。I

KeyCode Keys。I

Modifiers Keys。Ctrl+Keys。Shift

Alt false

Ctrl true

Shift true

KeyValue 73

KeyChar 不可用

尽管我们处理了KeyDown来获得特殊的字符,但是有些特殊字符(比如箭头键)在默认的情况下并不传送给控件。为了启用他们,自定义控件可以重写来自基类的IsInputKey方法

如果想在键盘事件之外获悉修饰键的状态,可以通过Control类的静态属性ModifierKeys来访问这类信息。

void MyCon-Click(object sender,EventArgs e)

{

if(Control.ModifierKeys==Keys.Control)

{

}

}

检查在鼠标点击事件中,Ctrl间是否是唯一被按下的修饰键。

PS:原文

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值