KeyUp 和 KeyDown 事件报告键盘本身准确的物理状态:按下键 (KeyDown) 及松开键 (KeyUp)。与此成对照的是,KeyPress 事件并不直接地报告键盘状态─ 它只提供键所代表的字符而不识别键的按下或松开状态。
进一步举例将有助于阐明这一差别。输入大写 "A" 时,KeyDown 事件获得 "A" 的 ASCII 码。在输入小写 "a" 时,KeyDown 事件获得相同的 ASCII 代码。为区分大小写,这些事件使用 shift 参数。与此相对照的是,KeyPress 事件将字母的大小写作为两个不同的 ASCII 字符处理。
KeyDown 和 KeyUp 事件通过提供下列两参数返回输入字符的信息。
参数 | 描述 |
Keycode | 指示按下的物理键。这时将 "A" 与 "a" 作为同一个键返回。它们具有相同的 keycode 值。但是请注意,键盘上的“1”和数字小键盘的“1”被作为不同的键返回,尽管它们生成相同的字符。 |
Shift | 指示 SHIFT、CTRL 和 ALT 键的状态。只有检查此参数才能判断输入的是大写字母还是小写字母。 |
keycode 参数通过 ASCII 值或键代码常数来识别键。字母键的键代码与此字母的大写字符的 ASCII 值相同。所以 "A" 和 "a" 的 keycode 都是由 Asc("A") 返回的数值。在下例中用 KeyDown 事件判断是否按下了 "A" 键:
Private Sub Text1_KeyDown(KeyCode As Integer, _
Shift As Integer)
If KeyCode = vbKeyA Then MsgBox "You pressed _
the A key."
End Sub
按下 SHIFT + "A" 或只按下 "A" 后都将显示消息框─ 也就是说,对每种情况,参数都是正确的。为判断按下的字母是大写形式还是小写形式需使用 shift 参数。请参阅本章后面的“Shift 参数”主题。
数字与标点符号键的键代码与键上数字的 ASCII 代码相同。因此“1”和“!”的 keycode 都是由 Asc("1") 返回的数值。同样,为检测“!”,需使用 shift 参数。
KeyDown 和 KeyUp 事件可识别标准键盘上的大多数控制键。其中包括功能键 (F1-F16)、编辑键(HOME、PAGE UP、DELETE 等等)、定位键(RIGHT、LEFT、UP 和 DOWN ARROW)和数字小键盘上的键。可以通过键代码常数或相应的 ASCII 值检测这些键。例如:
Private Sub Text1_KeyDown(KeyCode As Integer, _
Shift As Integer)
If KeyCode = vbKeyHome Then MsgBox "You _
pressed the HOME key."
End Sub
详细信息 关于字符代码的完整列表,请参阅“语言参考”的的“字符集 (0–127)”和“字符集 (128–255)”。“键代码常数”提供了键代码常数与对应的 ASCII 值的完整列表,也可通过“对象浏览器”并搜索 KeyCodeConstants 获得此列表。
键盘事件使用 shift 参数的方式与鼠标事件所用方式相同─ 将它作为代表 SHIFT、CTRL 和 ALT 键的整数值或常数。可将 KeyDown 与 KeyUp 事件及 shift 参数一同使用以区分字符的大小写或检测多种鼠标状态。
以上述示例为基础,可用 shift 参数判断是否按下了字母的大写形式。
Private Sub Text1_KeyDown(KeyCode As Integer, _
Shift As Integer)
If KeyCode = vbKeyA And Shift = 1 _
Then MsgBox "You pressed the uppercase A key."
End Sub
与鼠标事件相似,KeyUp 和 KeyDown 事件可将 SHIFT、CTRL 和 ALT 键作为单个来个体检测,也可作为组合键检测。下示例检测特定的 shift 键的状态。
打开一个新的工程并将变量 ShiftKey
添加到窗体的声明部分中:
Dim ShiftKey as Integer
将 Textbox 控件添加到窗体上并将此过程添加到 KeyDown 事件中:
Private Sub Text1_KeyDown(KeyCode As Integer, _ Shift As Integer) ShiftKey = Shift And 7 Select Case ShiftKey Case 1 '
或vbShiftMask
Print "You pressed the SHIFT key."
Case 2 '
或vbCtrlMask
Print "You pressed the CTRL key."
Case 4 '
或vbAltMask
Print "You pressed the ALT key."
Case 3
Print "You pressed both SHIFT and CTRL."
Case 5
Print "You pressed both SHIFT and ALT."
Case 6
Print "You pressed both CTRL and ALT."
Case 7
Print "You pressed SHIFT, CTRL, and ALT."
End Select
End Sub
只要 Textbox 控件获得焦点,在按下每个键或键的每个组合时,键或键的组合都将在窗体上显示相应的信息。
详细信息 请参阅本章前面的“检测 SHIFT、CTRL 和 ALT 键的状态”。