在VB中,不少控件都提供了鍵盤輸入功能(如文本框、組合框等),但它們對鍵盤的處理較簡單,遇到複雜一點的要求即無能爲力。設計
於是VB提供了KeyPress、KeyUp、KeyDown三種鍵盤事件,當用戶按鍵時,會觸發這三種事件,並且窗體和接受鍵盤輸入的控件都識別這三種事件。code
下表對這些事件做了描述:orm
鍵盤事件 | 觸發緣由 |
KeyPress | 按下某ASCII字符鍵 |
KeyDown | 按下鍵盤的任意鍵 |
KeyUp | 釋放鍵盤的任意鍵 |
KeyDown和KeyUp事件提供了最低級的鍵盤響應。對象
可用這些事件檢測KeyPress事件沒法檢測到的狀況: 事件
SHIFT、CTRL和ALT鍵的特殊組合。 ci
光標控制鍵。
table
HOME、END、PAGEUP、PAGEDOWN等。 sed
數字小鍵盤的數字鍵與打字鍵盤數字鍵的區別。
程序
不只響應按鍵操做並且響應釋放鍵操做(KeyPress只響應按鍵操做)。tab
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