键盘是另一个输入数据或信息的重要工具。Visual Basic提供了三种事件处理键盘行为,即KeyPress,KeyDown和KeyUp事件,而且窗体和接受键盘输入的控件都可识别这三种事件。
1.KeyPress事件
KeyPress事件是当键盘有按键发生触发时。KeyPress事件检测有Enter,Tab,BackSpace以及键盘上的字母、数字和标点符号键,对于其他功能键、编辑键和定位键,则不作响应。其语法格式为:
Private Sub 对象_KeyPress(KeyAscii As Integer)
KeyAscii参数是按键对应的ASCII码值。例如,在一个空白窗体的Form_KeyPress事件过程中,输入显示此参数的命令:
Print KeyAscii
运行程序后,如果在键盘上按下"a"字符,窗体将会显示出数字97,也就是KeyPress事件会在用户按下"a"字符时返回其字符码97。不过这些字符码通常不是我们需要的,利用Chr函数就可将字符码转换为该字符了,对于上行程序代码可改为:
Print Chr(KeyAscii)
KeyPress事件过程在截取TextBox或ComboBox控件所输入的击键时,可立即测试击键的有效性,也可用于识别键盘是否按键,或是否按下某些特定键(如回车键)。例如在给文本框输入数据时,要求只能输入0~9数字的程序代码为:
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii < 48 Or KeyAscii > 57 Then
KeyAscii = 0
Text1.SetFocus
End If
End Sub
数字0~9的ASCII值位于48~57之间。当按下的不是有效的数字时,KeyPress事件可使其在文本框中不显示,这样就不需要在文本框的LostFocus事件中判断输入的合法性了。
2.KeyDown和KeyUp事件
KeyDown事件是当按下按键时触发,KeyUp事件是当释放按键时触发,这两个事件提供了最低级的键盘响应,可以报告键盘的物理状态。语法格式如下:
Private Sub 对象_KeyDown(KeyCode As Integer, Shift As Integer)
Private Sub 对象_KeyUp(KeyCode As Integer, Shift As Integer)
其中,KeyCode是所按键的ASCII码值,Shift表示Shift,Ctrl,Alt键的按下状态。
KeyDown和KeyUp事件除了可识别KeyPress事件可识别的键,还可识别键盘上的大多数键,如功能键、编辑键、定位键和数字小键盘上的键。虽然键盘上的数字键与小键盘上的数字键的字符相同,但其ASCII码值是不同的。如表8.7所示,列出了一些常用的按键与KeyCode、常数的对应关系。
表8.7 一些常用KeyCode值
|-----------|----------|-----------|----------|----------|---------------|
| 功能键 | KeyCode值 | 常 数 | 功能键 | KeyCode值 | 常 数 |
| F1 | 112 | vbKeyF1 | Enter | 13 | vbKeyReturn |
| F2 | 113 | vbKeyF2 | Esc | 27 | vbKeyEscape |
| F3 | 114 | vbKeyF3 | PageUp | 33 | vbKeyPageUp |
| F4 | 115 | vbKeyF4 | PageDown | 34 | vbKeyPageDown |
| F5 | 116 | vbKeyF5 | Home | 35 | vbKeyHome |
| F6 | 117 | vbKeyF6 | End | 36 | vbKeyEnd |
| F7 | 118 | vbKeyF7 | Insert | 45 | vbKeyInsert |
| F8 | 119 | vbKeyF8 | Delete | 46 | vbKeyDelete |
| F9 | 120 | vbKeyF9 | ← | 37 | vbKeyLeft |
| F10 | 121 | vbKeyF10 | ↑ | 38 | vbKeyUp |
| Backspace | 8 | vbKeyBack | → | 39 | vbKeyRight |
| Tab | 9 | vbKeyTab | ↓ | 40 | vbKeyDown |
KeyDown和KdyUp事件报告键盘本身准确的物理状态,而KeyPress事件只提供键所代表的字符而不识别键的按下或松开状态。例如在输入大写字母"A"时,KeyDown事件获得"A"的ASCII码,输入小写"a"时,KeyDown事件获得相同的ASCII码。为了区分大小写,这些事件使用Shift参数。与此相对照的是,KeyPress事件将字母的大小写作为两个不同的ASCII字符处理。
键盘事件彼此之间并不互相排斥,当按下某个键时,将产生KeyPress和KeyDown事件。如果是KeyPress事件不能检测的键,那么仅触发KeyDown事件。虽然KeyDown和KeyUp事件可应用于大多数键,它们最经常应用的还是扩展的字符键、定位键、修饰键和按键的组合,区别数字小键盘和常规数字键。例如,要想在程序运行时,通过Ctrl+End组合键结束程序,可用下列代码实现:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 35 And Shift = 2 Then End
End Sub
每个KeyDown和KeyUp事件都附加在特定的对象上。为了编写应用于窗体上所有对象的键盘处理器,应将窗体的KeyPreview属性设置为True。将KeyPreview属性设置为True时,对所有控件,在控件识别KeyPress,KeyDown和KeyUp事件之前,窗体会识别控件的这些事件。
例如,可以在窗体上添加两个控件Text1和Command1,并把窗体的KeyPreview属性改为True。先在窗体声明部分加入:
Dim ShiftKey As Integer
然后在Form_KeyDown事件中编写如下代码:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
ShiftKey = Shift And 7
Select Case ShiftKey
Case 1
Print "You pressed the Shift Key."
Case 2
Print "You pressed the Ctrl Key."
Case 4
Print "You pressed the Alt Key."
End Select
End Sub
在运行程序时,无论哪个控件获得焦点,按下每个键都会在窗体上显示相应的信息。
如果已为菜单控件定义了快捷键,那么,当按下该键时会自动触发菜单控件的Click事件,而不是键盘事件。同样,如果在窗体上有一个命令按钮,其Default属性被设置为True,则Enter键将触发此命令按钮的Click事件而不是键盘事件。如果将命令按钮的Cancel属性设置为True,则按Esc键将触发按钮的Click事件而不是键盘事件。