在VB中,很多控件都提供了鍵盤輸入功能(如文本框、組合框等),但它們對鍵盤的處理較簡單,遇到復雜一點的要求即無能為力。
因而VB提供了KeyPress、KeyUp、KeyDown三種鍵盤事件,當用戶按鍵時,會觸發這三種事件,而且窗體和接受鍵盤輸入的控件都識別這三種事件。
下表對這些事件作了描述:
鍵盤事件 | 觸發原因 |
KeyPress | 按下某ASCII字符鍵 |
KeyDown | 按下鍵盤的任意鍵 |
KeyUp | 釋放鍵盤的任意鍵 |
KeyDown和KeyUp事件提供了最低級的鍵盤響應。
可用這些事件檢測KeyPress事件無法檢測到的情況:
SHIFT、CTRL和ALT鍵的特殊組合。
光標控制鍵。
HOME、END、PAGEUP、PAGEDOWN等。
數字小鍵盤的數字鍵與打字鍵盤數字鍵的區別。
不僅響應按鍵操作而且響應釋放鍵操作(KeyPress只響應按鍵操作)。
KeyPress事件:在按下與ASCII字符對應的鍵時將觸發KeyPress事件。
ASCII字符集代表標准鍵盤的字母、數字和標點符號以及部分控制鍵(ENTER、TAB、BACKSPACE鍵等)。
KeyDown和KeyUp事件能夠檢測其它功能鍵、編輯鍵和光標定位鍵。
當處理標准ASCII字符時應使用KeyPress事件。
如果希望將輸入到文本框中的所有字符都強制轉換為大寫字符,則可在輸入時使用此事件轉換大小寫:
Private Sub Text1_KeyPress(KeyAscii As Integer)
KeyAscii = Asc(Ucase(Chr(KeyAscii)))
End Sub
KeyAscii參數返回對應所按鍵的ASCII代碼。
下述事件過程使用 KeyPress檢測用戶是否正在按BACKSPACE鍵:
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = 8 Then MsgBox "You Pressed the BACKSPACE key."
End Sub
注:BACKSPACE鍵的ASCII值為8。
附:常用鍵的Keycode值
鍵 | Keycode | 鍵 | Keycode | 鍵 | Keycode |
BACKSPACE | 8 | TAB | 9 | ENTER | 13 |
CAPS LOCK | 20 | SHIFT | 16 | CTRL | 17 |
PAGEDOWN | 34 | PAUSE | 19 | ESC | 27 |
SPACEBAR | 32 | END | 35 | HOME | 36 |
PAGEUP | 33 | INS | 45 | DEL | 46 |
←↑→↓ | 37-40 | 0-9 | 48-57 | A-Z | 65-90 |
F1-F12 | 112-123 | 小鍵盤* | 106 | 小鍵盤+ | 107 |
小鍵盤0-9 | 96-105 | 小鍵盤- | 109 | 小鍵盤/ | 111 |
小鍵盤ENTER | 108 |
Shift參數 :鍵盤事件使用shift參數來判斷按下某鍵的同時是否按下了SHIFT、CTRL、ALT鍵或它們的組合。
如果按SHIFT鍵,則shift 為1;按CTRL鍵,shift為2;按ALT鍵,shift為3,通過鍵值總和來判斷這些組合。
例如:同時按下SHIFT和ALT鍵時shift等於5(1+4)。
在使用中,可將KeyDown 與KeyUp事件及shift參數一同使用以區分字符的大小寫或檢測各種組合鍵。
例如:以下事件過程可捕獲CTRL+ALT+F1並給出提示:
Private Sub Text1_Keydown(KeyCode As Integer, Shift As Integer)
If Keycode = 112 And Shift = 6 Then MsgBox "You press the CTRL+ALT+F1 Key!"
End Sub
編寫窗體級鍵盤處理程序 :
只有獲得焦點的對象才能夠接受鍵盤事件。
當窗體為活動窗體且其上所有控件均未獲得焦點時,窗體才獲得焦點。
這種情況只有在空窗體或窗體上的控件都無效時才發生。
如果將窗體上的KeyPreview屬性設置為True,則每個控件在識別其所擁有的KeyPress、KeyUP、KeyDown事件之前,窗體會搶先接受這些鍵盤事件。
當您希望無論何時按下某鍵都會執行同一個操作,而不管哪個控件在此時具有焦點時,這樣設置KeyPreview屬性極為有用。
可在"屬性"窗口中或通過Form_Load過程中的代碼設置窗體的KeyPreview屬性為True:
Private Sub Form_Load
Form1.KeyPreview = True
End Sub
需要注意的是,當把窗體的KeyPreview屬性設置為True時,窗體在控件之前識別鍵盤事件,但對控件來說事件仍然會發生,這可能會造成一次按鍵觸發多個不同的處理。
為防止這種情況,可在窗體鍵盤事件過程結束前將KeyAscii或KeyCode重置為0。
例如:在窗體上將ENTER鍵捕獲並處理后,把KeyAscii或KeyCode設置為0,則控件在自己的鍵盤事件過程中將無法識別按下的ENTER鍵,因而控件的鍵盤事件過程也不被調用。
設計一個窗體和文本框以及其它控件,無論焦點在哪個控件,按下CTRL+P即讓文本框顯示"Hello!";按下ALT+C 清除文本框;按下F10結束程序。
Private Sub Form_Load()
Form1.KeyPreview = True
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 80 And Shift = 2 Then Text1.Text = "Hello!"
If KeyCode = 67 And Shift = 4 Then Text1.Text = ""
If KeyCode = 121 Then End
End Sub