4 回答

TA貢獻1946條經(jīng)驗 獲得超3個贊
顯然對此有很多誤解!
KeyDown和之間的唯一實際區(qū)別KeyPress是KeyPress中繼按鍵產(chǎn)生的字符,并且只有在有按鍵時才調(diào)用。
換句話說,如果您按下A鍵盤,則會得到以下事件序列:
KeyDown:KeyCode = Keys.A,KeyData = Keys.A,修飾符= Keys.None
KeyPress:KeyChar ='a'
KeyUp:KeyCode = Keys.A
但是,如果按Shift+ A,您將得到:
KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,修飾符= Keys.Shift
KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,修飾符= Keys.Shift
KeyPress:KeyChar ='A'
KeyUp:KeyCode = Keys.A
KeyUp:KeyCode = Keys.ShiftKey
如果按住鍵一會,您將得到類似以下內(nèi)容的信息:
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 = Keys.A | Keys.Shift,修飾符= Keys.Shift
KeyPress:KeyChar ='A'
KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,修飾符= Keys.Shift
KeyPress:KeyChar ='A'
KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,修飾符= Keys.Shift
KeyPress:KeyChar ='A'
KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,修飾符= Keys.Shift
KeyPress:KeyChar ='A'
KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,修飾符= Keys.Shift
KeyPress:KeyChar ='A'
KeyUp:KeyCode = Keys.A
KeyUp:KeyCode = Keys.ShiftKey
請注意,它KeyPress發(fā)生在 KeyDown和之間KeyUp,而不是后面KeyUp,正如許多其他答案所述,KeyPress在不生成字符時不會調(diào)用,并且KeyDown在按住鍵時重復(fù)出現(xiàn),這與許多其他答案相反。
不會直接導(dǎo)致調(diào)用的鍵示例KeyPress:
Shift,Ctrl,Alt
F1 通過 F12
方向鍵
確實會導(dǎo)致調(diào)用的鍵示例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大致關(guān)聯(lián)到WM_KEYDOWN,KeyPress到WM_CHAR和KeyUp到WM_KEYUP。 WM_KEYDOWN 可以調(diào)用的次數(shù)少于鍵重復(fù)的次數(shù),但是它會發(fā)送一個重復(fù)計數(shù),IIRC,WinForms會使用該計數(shù)來精確地生成每個重復(fù)的KeyDown。

TA貢獻1875條經(jīng)驗 獲得超3個贊
KeyPress僅由可打印的字符觸發(fā),并在KeyDown事件后觸發(fā)。根據(jù)鍵入延遲設(shè)置,可以有多個KeyDown和KeyPress事件,但只有一個KeyUp事件。
KeyDown
KeyPress
KeyUp

TA貢獻1895條經(jīng)驗 獲得超3個贊
KeyPress比KeyDown(和KeyUp)具有更高的抽象級別。KeyDown和KeyUp與硬件相關(guān):鍵盤上按鍵的實際操作。KeyPress更是“我從鍵盤上收到了一個字符”。
- 4 回答
- 0 關(guān)注
- 548 瀏覽
添加回答
舉報