Windows窗体通过引发键盘事件来处理键盘输入以响应Windows消息,大多数Windows窗体应用程序都通过处理键盘事件来以独占方式处理键盘输入。

1.按键的类型

  Windows窗体将键盘输入标 识为由按位Keys枚举表示的虚拟键代码。使用Keys枚举,可以综合一系列按键以生成单个值,这些值与WM_KEYDOWN和 WM_SYSKEYDOWNWindows消息所伴随的值相对应。另外,程序开发人员可通过处理KeyDown或KeyUp 事件来检测大多数物理按键操作。字符键是Keys枚举的子集,它们与WM_CHAR和WM_SYSCHAR Windows消息所伴随的值相对应,如果通过组合按键得到一个字符,则可以通过处理KeyPress事件来检测该字符。

2.键盘事件的顺序

  一个控件上可能出现3个与键盘相关的事件,下面是这些事件发生的常规顺序:

用户按“a”键,该键将被预处理和调度,而且会发生KeyDown事件。 
用户按住“a”键,该键将被预处理和调度,而且会发生KeyPress事件。 
用户松开“a”键,该键将被预处理和调度,而且会发生KeyUp事件。 
3.键的预处理

  像其他消息一样,键盘消息是在窗体或控件的WndProc方法中处理的。窗体或控件在处理键盘消息之前,PreProcessMessage方法会调用一个或多个方法,这些方法可被重写以处理特殊的字符键和物理按键。

/*********************/

键事件按下列顺序发生: 
KeyDown 
KeyPress 
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字符 
2、KeyDown 和KeyUp 通常可以捕获键盘除了PrScrn所有按键(这里不讨论特殊键盘的特殊键) 
3、KeyPress 只能捕获单个字符 
4、KeyDown 和KeyUp 可以捕获组合键。 
5、KeyPress 可以捕获单个字符的大小写 
6、KeyDown和KeyUp 对于单个字符捕获的KeyValue 都是一个值,也就是不能判断单个字符的大小写。 
7、KeyPress 不区分小键盘和主键盘的数字字符。 
8、KeyDown 和KeyUp 区分小键盘和主键盘的数字字符。 
9、其中PrScrn 按键KeyPress、KeyDown和KeyUp 都不能捕获。 
/*******************/

其实我们按下一个键时,KeyDown和KeyPress是都要发生的,而且两个人看上去没有什么区别。但是其实两者还是有实质的区别的。

例如在一个多行文本框里面输入字符,
为什么我们没有定义一个键盘响应事件,但是键盘却响应了,把字符输入到了文本框呢?其实我觉得因为这个事件就是系统默认的一个消息响应,它就是
KeyPress。如果你自己还给KeyPress定义了自己的响应的话,那么程序会先执行你定义的程序,然后完成系统要求的显示字符事件的响应过程,但
是如果你在自己定义KeyPress事件如:private void textBox1_KeyPress(object
sender, System.Windows.Forms.KeyPressEventArgs
e)里面增加语句:e.Handled=true;那么系统要求的显示字符响应过程就不会被执行,原因就是这个语句的意思就是这个消息响应已经完成。但是
如果你在KeyDown,KeyUp里面加这条语句,显示字符串等消息还是会发生,这说明系统的显示字符串和KeyDown,KeyUp是没有关系的,而
对于回车和退格消息响应则是由KeyDown控制,增加那条语句则回车换行不会执行,退格响应也不会执行。

综上:要屏蔽键盘上的一个字符的输入,可以在KeyPress里面进行增加语句,而要屏蔽回车和退格则可以在KeyDown里面进行增加语句。

From:http://www.cnblogs.com/poren/articles/1536724.html

--------------------------------------其它资料:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
 {
  const int WM_KEYDOWN = 0x100;
  const int WM_SYSKEYDOWN = 0x104;
  if ((msg.Msg == WM_KEYDOWN) ||(msg.Msg == WM_SYSKEYDOWN))
  {
   switch (keyData)
   {
    case Keys.Down:
     this.Parent.Text = "向下键已经被捕捉";
     break;
    case Keys.Up:
     this.Parent.Text = "向上键已经被捕捉";
     break;
    case Keys.Left:
     this.Parent.Text = "向左键已经被捕捉";
     break;
    case Keys.Right:
     this.Parent.Text = "向右键已经被捕捉";
     break;
    case Keys.Home:
     this.Parent.Text = "Home 键已经被捕捉";
     break;
    case Keys.End:
     this.Parent.Text = "End 键已经被捕捉";
     break;
   }
  }
  return base.ProcessCmdKey(ref msg, keyData);
 }
}

补充:要使用e.handled=true 屏蔽输入,对普通键应放在KeyPress事件中,而控制键等应该在KeyDown中。

(转)KeyDown、KeyUp、KeyPress区别的更多相关文章

  1. C#中KeyDown和KeyPress区别

    1.比如说TexBox 输入'a' 按下->触发KeyDown事件,然后去处理 ->将a显示输入到文本框后 ->触发KeyPress事件

  2. 详解键盘事件(keydown,keypress,keyup)

    一.键盘事件基础 1.定义 keydown:按下键盘键 keypress:紧接着keydown事件触发(只有按下字符键时触发) keyup:释放键盘键 顺序为:keydown -> keypre ...

  3. KeyUp 和KeyDown 、KeyPress之间的区别

    keydown:用户在键盘上按下某按键是发生.一直按着某按键则会不断触发(opera浏览器除外). keypress:用户按下一个按键,并产生一个字符时发生(也就是类似shift.alt.ctrl之类 ...

  4. 【转】keypress keydown keyup 区别

    KeyPress主要用来接收字母.数字等ANSI字符,而 KeyDown 和 KeyUP 事件过程可以处理任何不被 KeyPress 识别的击键,诸如:功能键(F1-F12).编辑键.定位键以及任何这 ...

  5. C# 中 KeyPress 、KeyDown 和KeyPress的详细区别[转]

    研究了一下KeyDown,KeyPress 和KeyUp ,发现之间还是有点学问的. 让我们带着如下问题来说明,如果你看到这些问题你都知道,那么这篇文章你就当复习吧:) 1.这三个事件的顺序是怎么样的 ...

  6. 键盘事件keydown、keypress、keyup随笔整理总结(摘抄)

    原文1:http://www.cnblogs.com/silence516/archive/2013/01/25/2876611.html 原文2:http://www.cnblogs.com/leo ...

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

    原文: http://www.cnblogs.com/xiashengwang/archive/2011/09/15/2578798.html 在winform程序中,经常会用到这几个事件用于控制数字 ...

  8. C#控件中的KeyDown、KeyPress 与 KeyUp事件浅谈

    研究了一下KeyDown,KeyPress 和 KeyUp 的学问.让我们带着如下问题来说明: 1.这三个事件的顺序是怎么样的? 2.KeyDown 触发后,KeyUp是不是一定触发? 3.三个事件的 ...

  9. 键盘事件keydown、keypress、keyup随笔整理总结

    英文输入法:   事件触发顺序:keydown - > keypress - > keyup   中文输入法:   firfox:输入触发keydown,回车确认输入触发keyup chr ...

随机推荐

  1. 在Salesforce中进行Report和Dashboard的配置

    用Report和Dashboard去图形化比较不同Object的信息是一个十分普遍的需求,当然我们可以完全用Visual Page和Classes去自定义对应的Report和Dashboard的功能. ...

  2. 【T_SQL】基础 续+

    十.模糊查询 1.LIKE --查询时,字段中的内容并不一定与查询内容完全匹配,只要字段中含有这些内容. SELECT StuName AS 姓名 FROM Stuinfo WHERE stuname ...

  3. sql修改约束语法练习

    --以系统管理员身份登录到SQL Server服务器,并使用T-SQL语句实现以下操作:--1. 将stu数据库中student表的sno定义为主键:alter table [student] add ...

  4. 启动hbase时出现HMaster Aborted错误

    启动hbase时出现 java.lang.RuntimeException: HMaster Aborted at org.apache.hadoop.hbase.master.HMasterComm ...

  5. mvc-9测试和调试

    单元测试 单元测试是比集成测试更底层的测试,用于确保特定的后台代码片段能正常运行; 前端单元测试更多是为了发现浏览器兼容性的bug; 断言 断言是测试的核心,是一些表述代码期望执行结果的语句 //正确 ...

  6. yii2.0 的数据的 改

    修改数据 /**     * 根据获取到的数据的id 去编辑对应的数据  controller层     */ //引入对应的model use app\models\About; //定义一个方法 ...

  7. 转:Delphi 回调函数及例子

    http://anony3721.blog.163.com/blog/static/5119742010866050589/ { http://anony3721.blog.163.com/blog/ ...

  8. 【CLR in c#】属性

    1.无参属性 1.为什么有字段还需要属性呢? 因为字段很容易写出不恰当的代码,破坏对象的状态,比如Age=-1.人的年纪不可能为负数.使用属性后你可以缓存某些值或者推迟创建一些内部对象,你可以以线程安 ...

  9. android访问网络--okhttp

    import com.squareup.okhttp.MediaType;import com.squareup.okhttp.OkHttpClient;import com.squareup.okh ...

  10. iris数据集

    iris以鸢尾花的特征作为数据来源,数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性,是在数据挖掘.数据分类中非常常用的测试集.训练集. 链接地址