Winform下KeyDown,KeyPress,KeyUp事件的总结(转)

摘要:
1) 这三个事件的顺序调用1。KeyDown:当控件具有焦点2时按下该键时发生。KeyPress:当控件有焦点时按下该键时发生。textBox1_ KeyDowntextBox1_ KeyPresstextBox1_-从时间函数传入的事件参数中,KeyDown和KeyUp使用KeyEventArgs,KeyPress使用KeyPressEventArgs。请参阅MSDN。KeyEventArgs提供System.Windows.Forms.Keys中定义的枚举,例如KeyCode和KeyData//Summary://TheALTmodifyerkey.Alt=262144,}}KeyPressEventArgs只定义一个KeyChar,并且是char类型。privatevoidtextBox1_KeyDown{//如果{}}-要在按下后处理特定的输出字符,请使用KeyPress事件,例如验证是否输入了数字并判断Ascii代码,则是否安装了键盘的A键。

原文: http://www.cnblogs.com/xiashengwang/archive/2011/09/15/2578798.html

在winform程序中,经常会用到这几个事件用于控制数字输入,按键动作等操作,但一直没有完全弄清楚他们之间的区别和联系,到底什么时候用哪一个事件合适,闲暇无事,做了一个小小的总结,以免以后犯糊涂。

1) 这三个事件调用的先后顺序(MSDN)

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

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

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

2) KeyDown和KeyPress在MSDN上的解释完全一样,都是在按下键的时候发生,那区别是什么呢?

  1. textBox1_KeyDown(object sender, KeyEventArgs e)  
  2. textBox1_KeyPress(object sender, KeyPressEventArgs e)  
  3. textBox1_KeyUp(object sender, KeyEventArgs e)  

从时间函数传入的事件参数可以看出,KeyDown和KeyUp用的是KeyEventArgs,KeyPress 用的是KeyPressEventArgs。

查阅MSDN,KeyEventArgs 提供了KeyCode,KeyData等System.Windows.Forms.Keys里定义的枚举。如下:

  1. using System;  
  2. using System.ComponentModel;  
  3. using System.Drawing.Design;  
  4. using System.Runtime.InteropServices;  
  5.   
  6. namespace System.Windows.Forms  
  7. {  
  8.     // 概要:  
  9.     //     Specifies key codes and modifiers.  
  10.     [Flags]  
  11.     [ComVisible(true)]  
  12.     [TypeConverter(typeof(KeysConverter))]  
  13.     [Editor("System.Windows.Forms.Design.ShortcutKeysEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]  
  14.     public enum Keys  
  15.     {  
  16.         // 概要:  
  17.         //     The bitmask to extract modifiers from a key value.  
  18.         Modifiers = -65536,  
  19.         //  
  20.         // 概要:  
  21.         //     No key pressed.  
  22.         None = 0,  
  23.         //  
  24.         // 概要:  
  25.         //     The left mouse button.  
  26.         LButton = 1,  
  27.         //  
  28.         // 概要:  
  29.         //     The right mouse button.  
  30.         RButton = 2,  
  31.         //  
  32.         // 概要:  
  33.         //     The CANCEL key.  
  34.         Cancel = 3,  
  35.         //  
  36.         // 概要:  
  37.         //     The middle mouse button (three-button mouse).  
  38.         MButton = 4,  
  39.         //  
  40.         // 概要:  
  41.         //     The first x mouse button (five-button mouse).  
  42.         XButton1 = 5,  
  43.         //  
  44.         // 概要:  
  45.         //     The second x mouse button (five-button mouse).  
  46.         XButton2 = 6,  
  47.         //  
  48.         // 概要:  
  49.         //     The BACKSPACE key.  
  50.         Back = 8,  
  51.         //  
  52.         // 概要:  
  53.         //     The TAB key.  
  54.         Tab = 9,  
  55.         //  
  56.         // 概要:  
  57.         //     The LINEFEED key.  
  58.         LineFeed = 10,        
  59.         //  
  60.         // 概要:  
  61.         //     The CAPS LOCK key.  
  62.         Capital = 20,  
  63.         //内容太多了,略去。。。。。。  
  64.         // 概要:  
  65.         //     The ALT modifier key.  
  66.         Alt = 262144,  
  67.     }  
  68. }  

KeyPressEventArgs里自只定义了个KeyChar,并且是char型的。因此:

----要处理与按键相关的操作只能在KeyDown里处理,如是否按了Ctrl键或是同时按下了Ctrl+A键,诸如此类的按键判断都应该在KeyDown里处理。(KeyUp也能获得按键信息,不过是在按键上升是触发)

  1. private void textBox1_KeyDown(object sender, KeyEventArgs e)  
  2. {  
  3.    //是否安了键盘的A键  
  4.     if (e.KeyCode == Keys.A)  
  5.     {  
  6.     }  
  7. }  

----要处理具体按下后的输出字符要用KeyPresss事件,比如验证是不是输入了数字,判断Ascii码即可。

  1. private void textBox1_KeyPress(object sender, KeyPressEventArgs e)  
  2. {  
  3.     if (e.KeyChar >= '0' && e.KeyChar <= '9')  
  4.     {  
  5.     }  
  6. }  


在KeyDown里可以判断是不是按了数字键来判断,但是要同时判断键盘上的数字和小键盘的数字,不太可取。

  1. private void textBox1_KeyDown(object sender, KeyEventArgs e)  
  2. {  
  3.     if((e.KeyCode >= Keys.D0 && e.KeyCode <=Keys.D9) ||  
  4.         (e.KeyCode>= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9))  
  5.     {  
  6.     }  
  7. }  


3)取消用户输入应该用什么方法?

不要用户输入数字以外的字符,已经输入的字符如何取消呢?答案是可以在KeyPress里取消,也可以在KeyDown里取消。

1, KeyPress里取消输入 (A不能输入)

  1. private void textBox1_KeyPress(object sender, KeyPressEventArgs e)  
  2. {  
  3.     if (e.KeyChar == 'A')  
  4.     {  
  5.         e.Handled = true;  
  6.     }  
  7. }  

2,KeyDown里取消输入 (A不能输入)

  1. private void textBox1_KeyDown(object sender, KeyEventArgs e)  
  2. {  
  3.     if (e.KeyCode == Keys.A)  
  4.     {  
  5.         e.SuppressKeyPress();  
  6.     }  
  7. }  

SuppressKeyPress方法可以取消KeyPress事件,注意此时KeyUp事件也被取消了(实验得知)。

4)关于KeyDown和KeyUp

 KeyDown触发几次KeyUp就触发几次。

1,按键盘的A键,KeyDwon和KeyUp各触发一次。

KeyDown里的KeyEventArgs的值如下:(注意:KeyCode,Keydata,KeyValue里的值是伪代码,不一定和程序吻合,只是为了说明问题)

KeyCode:Keys.A

KeyData:Keys.A

KeyValue:65

KeyUp里的KeyEventArgs的值和KeyDown相同。

2,按键盘的Ctrl+A,KeyDwon和KeyUp个触发两次。

第一次KeyDown里的KeyEventArgs的值如下:

KeyCode:Keys.ContrlKey

KeyData:Keys.ContrlKey

KeyValue:17

第二次KeyDown里的KeyEventArgs的值如下:

KeyCode:Keys.A

KeyData:Keys.ContrlKey + Keys.A

KeyValue:65

第一次KeyUp里的KeyEventArgs的值如下:

 

KeyCode:Keys.A

KeyData:Keys.ContrlKey + Keys.A

KeyValue:65

第二次KeyUp里的KeyEventArgs的值如下:

 

KeyCode:Keys.ContrlKey

KeyData:Keys.ContrlKey

KeyValue:17

可以看出,KeyUp的顺序和KeyDown顺序是相反的,类似于栈,先进后出。

5) 某些特殊键在控件上被默认处理的解决办法

比如,TextBox上的TAB键就被默认处理的,在TextBox上按Tab键,将不会触发KeyDown已经后面的KeyPress和KeyUp事件,解决的办法是重新TextBox控件的IsInputKey方法,这个在MSDN上有说明,特实践证明了下,确实可行。

  1. class TextBoxEx :System.Windows.Forms.TextBox  
  2. {  
  3.   
  4.     protected override bool IsInputKey(System.Windows.Forms.Keys keyData)  
  5.     {  
  6.         if (keyData == System.Windows.Forms.Keys.Tab)  
  7.         {  
  8.             return true;  
  9.         }  
  10.         return base.IsInputKey(keyData);  
  11.     }  
  12. }  

换用以上的TextBoxEx后,按下Tab键,就能触发KeyDown,KeyPress,KeyUp等事件了。


以上纯属个人无事消遣,各位看官笑过就好。

免责声明:文章转载自《Winform下KeyDown,KeyPress,KeyUp事件的总结(转)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇c# 方法重载的一些事情NetApp FAS2240-4存储删除文件数据恢复下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C# WINFORM 编程中,选择**文件夹**而不是文件的方法(转)

 我们选择文件可以用 OpenFileDialog ,但是文件夹有两种方法。 法一:    用C#的FolderNameEditor类的子类FolderBrowser类来实现获取浏览文件夹对话框的功能。下面来看看具体是怎么实现的。  首先新建一个winform的项目,再新建一个类文件(File->AddNewItem->Class)。 因为Fo...

WinForm控件之【TextBox】

基本介绍 文本控件,提供多行文本编辑和密码字符掩码功能。 常设置属性 ForeColor:此组件的前景色,用于显示文本; BorderStyle:指示编辑控件是否应带有边框或边框类型; Lines:多行编辑中的文本行,作为字符串值的数组; MaxLength:指定可以在编辑控件中输入的最大字符数; PasswordChar:指示将为单行编辑控件的密码输入显示...

WinForm窗体间如何传值的几种方法

(转) 窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式: 公共静态变量; 使用共有属性; 使用委托与事件; 通过构造函数把主窗体传递到从窗体中; 一、通过静态变量 特点:传值是双向的,实现简单 实现代码如下: 在一个app类中定义一个静态成员value public class app { public static st...

winform窗体 【打开多个窗体、窗体之间传值、打开唯一窗体】

1、打开多个窗体 2、窗体之间的传值 3打开唯一窗体 Form1中btn1按钮点击show出Form2,当Form2处于开启状态时,再次点击btn1不会继续弹出窗体,而是将焦点定位至已开启的Form2上;当Form2关闭后,再次点击btn1则会show出一个新的Form2; Form1: //创建一个全局集合,用来放置已经show出的窗体对象 L...

Winform开发框架之单据窗体生成(主从表,流水单号)

项目源码下载地址:https://github.com/GarsonZhang/GZFramework.Demo 前言 1.在开始本节前请先重置代码为 chapter-03-start 懒人地址:https://github.com/GarsonZhang/GZFramework.ShareDemo/tree/chapter-03-start 2.创建表...

winform中文本框,软键盘跟随

private void textBox1_Click(object sender, EventArgs e) { //Control.MousePosition Point p = System.Windows.Forms.Cursor.Position;...