(转)KeyDown、KeyUp、KeyPress区别

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中。

时间: 2024-08-04 01:58:58

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

jQuery基础:keydown( ) 与 keypress( ) 区别

1.结论: 相同点:当按钮被按下时,会发生该事件,发生在当前获得焦点的元素上. 输入中文区别较大,试一试 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <form action="">

C#中KeyDown和KeyPress区别

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

【转】keypress keydown keyup 区别

KeyPress主要用来接收字母.数字等ANSI字符,而 KeyDown 和 KeyUP 事件过程可以处理任何不被 KeyPress 识别的击键,诸如:功能键(F1-F12).编辑键.定位键以及任何这些键和键盘换档键的组合等.与 KeyDown 和 KeyUp 事件不同的是,KeyPress 不显示键盘的物理状态(SHIFT键),而只是传递一个字符.KeyPress 将每个字符的大.小写形式作为不同的键代码解释,即作为两种不同的字符.而 KeyDown 和 KeyUp 用两种参数解释每个字符的大

转载关于KeyPress和KeyDown事件的区别和联系

KeyDown:在控件有焦点的情况下按下键时发生. KeyPress:在控件有焦点的情况下按下键时发生. KeyUp:在控件有焦点的情况下释放键时发生. 1.KeyPress主要用来接收字母.数字等ANSI字符   KeyDown 和 KeyUP 事件过程通常可以捕获键盘除了PrScrn(在键盘右上角)所有按键(这里不讨论特殊键盘的特殊键) 2.KeyPress 只能捕获单个字符   KeyDown 和KeyUp 可以捕获组合键. 3.KeyPress 不显示键盘的物理状态(SHIFT键),而只

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

原文1:http://www.cnblogs.com/silence516/archive/2013/01/25/2876611.html 原文2:http://www.cnblogs.com/leolai/archive/2012/08/01/2618386.html 英文输入法: 事件触发顺序:keydown - > keypress - > keyup 中文输入法: firfox:输入触发keydown,回车确认输入触发keyup chrome:输入触发keydown.keyup,回车确

keydown、keypress、keyup的用法

一.KeyDown.KeyPress 与 KeyUp发生顺序 keydown - > keypress - > keyup 二.事件引发的时间 KeyDown 和 KeyPress 事件在按下键时发生,KeyUp 事件在释放键时发生. 三.KeyDown 触发后,KeyUp是不是一定触发 KeyDown触发后,不一定触发KeyUp,当KeyDown 按下后,拖动鼠标,那么将不会触发KeyUp事件. 四.KeyPress 和KeyDown .KeyPress之间的区别 1.KeyPress主要用

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

C#控件中的KeyDown.KeyPress 与 KeyUp事件浅谈 研究了一下KeyDown,KeyPress 和 KeyUp 的学问.让我们带着如下问题来说明: 1.这三个事件的顺序是怎么样的? 2.KeyDown 触发后,KeyUp是不是一定触发? 3.三个事件的定义 4.KeyDown.KeyUp 和KeyPress 之间的区别 5.如何区分是否按的是小键盘? 6.PrScrn按键三个事件能够捕获吗? 7.{菜单键}和{开始键}KeyPress能够捕获吗? 8.如何捕获系统的组合键? 9

KeyPress 和KeyDown 、KeyPress之间的区别

(一)键事件按下列顺序发生: KeyDown KeyPress KeyUp (二)KeyDown触发后,不一定触发KeyUp,当KeyDown 按下后,拖动鼠标,那么将不会触发KeyUp事件. (三)定义 KeyDown:在控件有焦点的情况下按下键时发生. KeyPress:在控件有焦点的情况下按下键时发生.(下面会说和KeyDown 的区别) KeyUp:在控件有焦点的情况下释放键时发生. (四)KeyPress 和KeyDown .KeyPress之间的区别 1.KeyPress主要用来捕获

KeyDown和KeyPress的区别

虽然从字面理解, KeyDown是按下一个键的意思, 但实际上二者的根本区别是, 系统由KeyDown返回键盘的代码, 然后由TranslateMessage函数翻译成成字符, 由KeyPress返回字符值. 因此在KeyDown中返回的是键盘的代码, 而KeyPress返回的是ASCII字符. 所以根据你的目的, 如果只想读取字符, 用KeyPress, 如果想读各键的状态, 用KeyDown. 说KeyDown是按下, KeyPress是按下并松开, 是不对的. 如果你一直按着键呢? 这时不