C# WinForm中PreviewKeyDown、KeyDown、KeyPress、KeyUp區別與聯係
1、鍵事件按下列順序發生:
PreviewKeyDownKeyDown
KeyPress
KeyUp
2、KeyDown觸發後,不一定觸發KeyUp,當KeyDown 按下後,拖動鼠標,那麼將不會觸發KeyUp事件。
3、定義
PreviewKeyDown:在焦點位於此控件上的情況下,當有按鍵動作時發生(在 KeyDown 事件之前發生)。
小注:
某些按鍵,比如 Tab、Return、Esc 和箭頭鍵,通常會被某些控件忽略,因為它們沒有被視為輸入按鍵。 例如,默認情況下,Button 控件忽略箭頭鍵。 通常按箭頭鍵會使焦點移動到上一個或下一個控件。 箭頭鍵被視為導航鍵,按這些鍵通常不會引發 Button 的 KeyDown 事件。 但是,按 Button 的箭頭鍵的確將引發 PreviewKeyDown 事件。 通過為 Button 處理 PreviewKeyDown 事件和把 IsInputKey 屬性設置為 true,可以在按箭頭鍵時提出 KeyDown 事件。 但是,如果處理箭頭鍵,則焦點將不再移動到上一個或下一個控件。
KeyDown:在控件有焦點的情況下按下鍵時發生。
小注:
若要僅在窗體級別處理鍵盤事件而不允許其他控件接收鍵盤事件,請將窗體的 KeyPress 事件處理方法中的 KeyPressEventArgs.Handled 屬性設置為 true。 某些鍵,如 Tab、Return、Esc 和箭頭鍵,由控件自動處理。 為使這些鍵引發 KeyDown 事件,必須在窗體上的每個控件中重寫 IsInputKey 方法。 用於重寫 IsInputKey 的代碼需要確定是否按下了某個特殊鍵,並且需要返回一個 true 值。 不用重寫 IsInputKey 方法,您可以處理 PreviewKeyDown 事件並將 IsInputKey 屬性設置為 true。 有關代碼示例,請參見 PreviewKeyDown 事件。
KeyPress:在控件有焦點的情況下按下鍵時發生。(下麵會說和KeyDown 的區別)
小注:
KeyPress 事件不能由非字符鍵引發;但是非字符鍵能夠引發 KeyDown 和 KeyUp 事件。
使用 KeyChar 屬性采樣運行時的鍵擊,以及使用或修改常用鍵擊的一個子集。
若要僅在窗體級別處理鍵盤事件而不允許其他控件接收鍵盤事件,請將窗體的 KeyPress 事件處理方法中的 KeyPressEventArgs.Handled 屬性設置為 true。
KeyUp:在控件有焦點的情況下釋放鍵時發生。
小注:
若要僅在窗體級別處理鍵盤事件而不允許其他控件接收鍵盤事件,請將窗體的 KeyPress 事件處理方法中的 KeyPressEventArgs.Handled 屬性設置為 true。 某些鍵,如 Tab、Return、Esc 和箭頭鍵,由控件自動處理。 為使這些鍵引發 KeyUp 事件,必須在窗體上的每個控件中重寫 IsInputKey 方法。 用於重寫 IsInputKey 的代碼需要確定是否按下了某個特殊鍵,並且需要返回一個 true 值。
4、KeyPress 和KeyDown 、KeyPress之間的區別
KeyPress主要用來捕獲數字(注意:包括Shift+數字的符號)、字母(注意:包括大小寫)、小鍵盤等除了F1-12、SHIFT、Alt、Ctrl、Insert、Home、PgUp、Delete、End、 PgDn、ScrollLock、Pause、NumLock、{菜單鍵}、{開始鍵}和方向鍵外的ANSI字符
KeyDown 和KeyUp 通常可以捕獲鍵盤除了PrScrn所有按鍵(這裏不討論特殊鍵盤的特殊鍵)
KeyPress 隻能捕獲單個字符
KeyDown 和KeyUp 可以捕獲組合鍵。
KeyPress 可以捕獲單個字符的大小寫
KeyDown和KeyUp 對於單個字符捕獲的KeyValue 都是一個值,也就是不能判斷單個字符的大小寫。
KeyPress 不區分小鍵盤和主鍵盤的數字字符。
KeyDown 和KeyUp 區分小鍵盤和主鍵盤的數字字符。
其中PrScrn 按鍵KeyPress、KeyDown和KeyUp 都不能捕獲。
小注:
KeyDown捕獲不到鍵盤輸入,注意窗口的keypreview屬性設置為true
最後更新:2017-04-03 16:49:17