P D*_*ddy
292
这显然有很多误解!
KeyDown和之间唯一的实际区别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等
- Spacebar
- Tab (KeyChar ='\ t',ASCII 9)
- Enter (KeyChar ='\ r',ASCII 13)
- Esc (KeyChar ='\ x1b',ASCII 27)
- Backspace (KeyChar ='\ b',ASCII 8)
对于好奇,KeyDown大致关联到WM_KEYDOWN,KeyPress到WM_CHAR和KeyUp到WM_KEYUP. WM_KEYDOWN 可以被称为少于密钥重复次数,但它发送重复计数,IIRC,WinForms用于每次重复生成一个KeyDown.