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 '或vbShiftMaskPrint "You pressed the SHIFT key."Case 2 '或vbCtrlMaskPrint "You pressed the CTRL key."Case 4 '或vbAltMaskPrint "You pressed the ALT key."Case 3Print "You pressed both SHIFT and CTRL."Case 5Print "You pressed both SHIFT and ALT."Case 6Print "You pressed both CTRL and ALT."Case 7Print "You pressed SHIFT, CTRL, and ALT."End SelectEnd Sub
只要 Textbox 控件获得焦点,在按下每个键或键的每个组合时,键或键的组合都将在窗体上显示相应的信息。
详细信息 请参阅本章前面的“检测 SHIFT、CTRL 和 ALT 键的状态”。