关于这一点,显然有a lot种误解!
KeyDown
和KeyPress
之间唯一的实际区别是,KeyPress
传递由按键产生的字符,并且只有在存在一个字符时才会被调用.
换句话说,如果你在键盘上按A,你将得到以下事件序列:
- KeyDown:KeyCode=Keys.A、 KeyData=密钥.A、 修饰符=键.没有一个
- KeyPress:KeyChar=‘a’
- KeyUp:KeyCode=Keys.A.
但如果按Shift键+A键,您将得到:
- KeyDown:KeyCode=Keys.ShiftKey,KeyData=Keys.ShiftKey,Shift,修改器=Keys.Shift
- KeyDown:KeyCode=Keys.A、 KeyData=密钥.A | keys .Shift,修饰符=关键点.转移
- KeyPress:KeyChar=‘A’
- KeyUp:KeyCode=Keys.A.
- KeyUp:KeyCode=Keys.ShiftKey
如果您按住这些键一段时间,您将得到类似于:
- KeyDown:KeyCode=Keys.ShiftKey,KeyData=Keys.ShiftKey,Shift,修改器=Keys.Shift
- KeyDown:KeyCode=Keys.ShiftKey,KeyData=Keys.ShiftKey,Shift,修改器=Keys.Shift
- KeyDown:KeyCode=Keys.ShiftKey,KeyData=Keys.ShiftKey,Shift,修改器=Keys.Shift
- KeyDown:KeyCode=Keys.ShiftKey,KeyData=Keys.ShiftKey,Shift,修改器=Keys.Shift
- KeyDown:KeyCode=Keys.ShiftKey,KeyData=Keys.ShiftKey,Shift,修改器=Keys.Shift
- KeyDown:KeyCode=Keys.A、 KeyData=密钥.A | keys .Shift,修饰符=关键点.转移
- KeyPress:KeyChar=‘A’
- KeyDown:KeyCode=Keys.A、 KeyData=密钥.A | keys .Shift,修饰符=关键点.转移
- KeyPress:KeyChar=‘A’
- KeyDown:KeyCode=Keys.A、 KeyData=密钥.A | keys .Shift,修饰符=关键点.转移
- KeyPress:KeyChar=‘A’
- KeyDown:KeyCode=Keys.A、 KeyData=密钥.A | keys .Shift,修饰符=关键点.转移
- KeyPress:KeyChar=‘A’
- KeyDown:KeyCode=Keys.A、 KeyData=密钥.A | keys .Shift,修饰符=关键点.转移
- KeyPress:KeyChar=‘A’
- KeyUp:KeyCode=Keys.A.
- KeyUp:KeyCode=Keys.ShiftKey
请注意,KeyPress
出现在in between KeyDown
和KeyUp
之后,正如许多其他答案所述,KeyPress
在没有生成字符时不被调用,KeyDown
在按下键时被重复,这也与许多其他答案相反.
执行not的按键示例直接导致呼叫KeyPress
:
- Shift、Ctrl、Alt
- F1到F12
- 方向键
do导致调用KeyPress
的键示例:
- A到Z,0到9,等等.
- 空格键
- 制表符(KeyChar=‘\t’,ASCII 9)
- 输入(KeyChar=‘\r’,ASCII 13)
- Esc(KeyChar='\x1b',ASCII 27)
- 退格(KeyChar='\b',ASCII 8)
对于好奇的人来说,KeyDown
与WM_KEYDOWN
、KeyPress
与WM_CHAR
、KeyUp
与WM_KEYUP
大致相关.WM_KEYDOWN
can的调用可能少于密钥重复次数,但它会发送一个重复计数,IIRC,WinForms使用该计数每次重复只生成一个KeyDown.