簡體   English   中英

Visual Studio 中 KeyDown 事件、KeyPress 事件和 KeyUp 事件的區別

[英]Difference between the KeyDown Event, KeyPress Event and KeyUp Event in Visual Studio

誰能告訴我KeyDown事件、 KeyPress事件和KeyUp事件之間的區別? 我檢查了 msdn 站點,它並沒有解釋太多。

任何人都可以在每個事件發生時簡單地告訴我嗎? 我覺得所有上述事件都是在按下一個鍵時發生的。 那么它們之間的確切區別是什么。

MSDN 文檔相當清楚地說明了這三個事件發生的順序:

關鍵事件按以下順序發生:

  1. 按鍵
  2. 按鍵
  3. 鍵升

一旦用戶按下鍵盤上的一個鍵, KeyDown就會被觸發,而他們仍然按住它。

KeyPress字符鍵引發(與 KeyDown 和 KeyUp 不同,它們也為非字符鍵引發),同時按下鍵。 這是比 KeyDown 或 KeyUp 的“更高級別”事件,因此,在EventArgs中有不同的數據可用。

KeyUp在用戶釋放鍵盤上的鍵后引發。

通常,您應該在應用程序中處理KeyUp事件。 用戶釋放密鑰之前,不應在 UI 中啟動操作。 而且由於KeyUp是比KeyPress更低級別的事件,因此您總是可以隨時獲得有關所按下鍵的大量信息,它甚至可以用於處理非字符鍵。


然而,關於所有這些事件需要注意的是,它們僅由具有焦點的控件引發。 這意味着如果表單上的按鈕控件當前具有焦點,則表單的任何關鍵事件都不會被引發。 對於剛接觸 .NET 的程序員來說,這常常令人困惑。 處理此問題的最佳方法是覆蓋表單的ProcessCmdKey方法

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == (Keys.Control | Keys.A))
    {
        MessageBox.Show("You pressed Ctrl+A!");
    }
    return base.ProcessCmdKey(ref msg, keyData);
}
  • KeyDown:當人按下一個鍵時發生(當鍵盤第一次檢測到一個鍵上的手指時,這發生在按下鍵時)。

  • KeyPress:當一個鍵被按下然后釋放時發生。

  • KeyUp:釋放鍵時發生

你是對的,所有這些事件都發生在一個鍵被按下然后釋放時,按照我上面描述的順序。

這是您不想使用 KeyUp 的情況:

您有一個列表框,在一行上按 Enter 鍵會調用一個編輯器對話框。 問題:如果用戶在編輯器的 OK 按鈕上按下 Enter 鍵,KeyUp(e.KeyCode=Enter) 事件將泄漏回您的列表框,導致編輯器重新打開。 如果用戶按下編輯器的 OK 按鈕上的空格鍵,則不會發生這種情況; 在這種情況下,KeyUp(e.KeyCode=Space) 事件在編輯器關閉之前由編輯器處理。

這是我使用的選擇啟發式方法:

If I'm handling the Enter key and I need to guard against a case like the one above
  then I use KeyDown    
Else if I'm handling key combinations (e.g. CTRL+C)
   then I favor* KeyDown (KeyUp can make these awkward)   
Else if I am allowing press & hold autorepeat
  then I use KeyDown    
Else 
  I use KeyUp

*如果該操作是可以在常用產品(例如 Microsoft Office)中執行的操作,例如 CTRL+A(用於“全選”),那么我會模仿 Microsoft 的行為,因為這是用戶習慣的行為。

KeyDown然后KeyPress然后KeyUp是我找到的順序。

通常,當用戶按住一個鍵進行多模式輸入並修改控制鍵模式的應用程序時,您希望掛鈎KeyDown ,例如在 shift-click 操作中。 KeyPress用於簡單的鍵輸入類型邏輯 - 只是獲取擊鍵。 KeyUp被掛鈎以放入在其他處理KeyPress之后執行的邏輯,例如在其主要KeyPress邏輯生效后修改文本編輯框的內容。 坦率地說,我並沒有那么多地使用KeyUp ,但有時它是在其他東西處理KeyPress之后獲取消息的唯一方法,您需要檢查/修復發生了什么。

除了其他答案:

當試圖確定您應該將您的操作與這些事件中的哪個事件聯系起來時,請注意KeyDown事件將在按住鍵時多次觸發。 有時您想要這種行為,有時則不需要。 基於此,我建議以下用法(根據我的經驗):

(觸發事件的順序)

按鍵

發生:當按鍵被按下並按住時
用法:按下按鈕時立即執行操作,甚至按住時執行多次
示例:用箭頭鍵移動 cursor

.

按鍵

發生:字符鍵被按下(更高級別的事件)
用法:任何與打字相關的東西
示例:處理文本框輸入

.

鍵升

發生:密鑰被釋放
用法:執行每次擊鍵僅應發生一次的關鍵操作
示例:將數據寫入文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM