.NET中的KeyDown和KeyPress有什么区别?
.net
的KeyDown
和KeyPress
事件有什么区别?
这显然有很多误解!
KeyDown
和KeyPress
唯一的区别在于KeyPress
会KeyPress
一个按键产生的字符,并且只有在有按键时才被调用。
换句话说,如果你按下键盘上的A键,你会得到这样一系列的事件:
- KeyDown:KeyCode = Keys.A,KeyData = Keys.A,Modifiers = Keys.None
- KeyPress:KeyChar ='a'
- KeyUp:KeyCode = Keys.A
但是如果你按Shift + A ,你会得到:
- KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,Modifiers = Keys.Shift
- KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,Modifiers = Keys.Shift
- KeyPress:KeyChar ='A'
- KeyUp:KeyCode = Keys.A
- KeyUp:KeyCode = Keys.ShiftKey
如果你按住一段时间,你会得到如下的东西:
- KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,Modifiers = Keys.Shift
- KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,Modifiers = Keys.Shift
- KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,Modifiers = Keys.Shift
- KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,Modifiers = Keys.Shift
- KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,Modifiers = Keys.Shift
- KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,Modifiers = Keys.Shift
- KeyPress:KeyChar ='A'
- KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,Modifiers = Keys.Shift
- KeyPress:KeyChar ='A'
- KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,Modifiers = Keys.Shift
- KeyPress:KeyChar ='A'
- KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,Modifiers = Keys.Shift
- KeyPress:KeyChar ='A'
- KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,Modifiers = Keys.Shift
- KeyPress:KeyChar ='A'
- KeyUp:KeyCode = Keys.A
- KeyUp:KeyCode = Keys.ShiftKey
请注意, KeyPress
出现在 KeyDown
和KeyUp
之间 , 而不是 KeyUp
之后,因为许多其他答案已经声明,当不生成一个字符时KeyPress
不被调用,并且KeyDown
被重复,同时按下该键也是相反的到许多其他的答案。
不直接导致KeyPress
调用的键的示例:
- Shift , Ctrl , Alt
- F1到F12
- 方向键
确实导致KeyPress
调用的键的示例:
- A到Z , 0到9等
- 空格键
- Tab (KeyChar ='\ t',ASCII 9)
- input (KeyChar ='\ r',ASCII 13)
- Esc (KeyChar ='\ x1b',ASCII 27)
- 退格 (KeyChar ='\ b',ASCII 8)
奇怪的是, KeyDown
与WM_KEYDOWN
, KeyPress
到WM_CHAR
和KeyUp
到WM_KEYUP
大致相关。 WM_KEYDOWN
可以被调用的次数less于键重复次数,但是它会发送一个重复次数,IIRC,WinForms用来每次重复产生一次KeyDown。
KeyPress事件不是由非字符键引发的; 但是,非字符键会引发KeyDown和KeyUp事件。
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress.aspx
KeyPress仅由可打印字符触发,并在KeyDown事件之后触发。 根据input延迟设置,可以有多个KeyDown和KeyPress事件,但只有一个KeyUp事件。
的KeyDown
按键
KEYUP
来自MSDN:
重要事件按以下顺序发生:
的KeyDown
按键
KEYUP
此外,KeyPress给你一个机会宣布行动“ 处理 ”,以防止它做任何事情。
KeyPress是比KeyDown(和KeyUp)更高级别的抽象。 KeyDown和KeyUp是硬件相关的:键盘上键的实际动作。 KeyPress更“我从键盘上收到一个字符”。
我一直以为只要按下按键就会发生按键,按键是按下按键并释放按键的动作。
我发现这给了一个不同的解释: http : //bytes.com/topic/net/answers/649131-difference-keypress-keydown-event
Keydown按下键不放开,按键是一个完整的新闻发布周期。
换句话说,KeyDown + KeyUp = Keypress
来自博客开发者 :
为了理解keydown和keypress之间的区别,理解“字符”和“键”之间的区别是有用的。 “键”是计算机键盘上的物理button,而“字符”是通过按下button键入的符号。 理论上,keydown和keyup事件代表被按下或释放的键,而keypress事件代表被键入的字符 。 理论的实现在所有的浏览器中都不相同。
注意:您也可以尝试按键事件testing器 (在上述网站上提供)来理解这个概念。
最简单的解释:
我按住了'd'键一秒钟,然后释放。
DDDDDD
在第一个d出现在屏幕上之前发生了一次keydown事件,按键事件发生了6次,keyup事件发生在屏幕上最后d之后。