Visual Basic 键盘事件

键盘是另一个输入数据或信息的重要工具。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事件而不是键盘事件。

相关推荐
人道领域16 分钟前
【零基础学java】(Map集合)
java·开发语言
杀死那个蝈坦17 分钟前
JUC并发编程day1
java·开发语言
lly20240617 分钟前
SQLite Alter 命令详解
开发语言
沃斯堡&蓝鸟18 分钟前
DAY33 类的装饰器
开发语言·python
小白学大数据18 分钟前
海量小说数据采集:Spark 爬虫系统设计
大数据·开发语言·爬虫·spark
伯明翰java25 分钟前
Java接口
java·开发语言
Macbethad39 分钟前
Arduino智能硬件开发技术报告
开发语言
云和数据.ChenGuang1 小时前
Java装箱与拆箱(面试核心解析)
java·开发语言·面试
Evand J1 小时前
【定位代码】复杂地磁环境下无人机自主导航增强技术研究——地磁匹配与多源数据融合方法,附matlab代码
开发语言·matlab·无人机
沛沛老爹1 小时前
2025年java总结:缝缝补补又一年?
java·开发语言·人工智能·python·guava·总结·web转型ai