每个 KeyDown 和 KeyUp 事件都附加在特定的对象上。为了编写应用于窗体上所有对象的键盘处理器,应将窗体的 KeyPreview 属性设置为 True。将 KeyPreview 属性设置为 True 时,对所有控件,在控件识别 KeyPress、KeyUp、KeyDown 事件之前,窗体会识别控件的这些事件。这就使它很容易对具体击键事件作出一般响应。
可在“属性”窗口中或通过 Form_Load 过程中的代码设置窗体的 KeyPreview 属性为 True:
Private Sub Form_Load
Form1.KeyPreview = True
End Sub
通过声明 ShiftKey
变量并使用 Select Case 语句可检测窗体的多种击键状态。无论哪个控件获得焦点,以下过程都将在窗体上显示信息。
打开一个新工程并将变量 ShiftKey
添加到窗体的声明部分:
Dim ShiftKey as Integer
将 Textbox 控件和 CommandButton 控件添加到窗体中并将以下过程添加到窗体的 KeyDown 事件中:
Private Sub Form_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."
End Select
End Sub
如果已为菜单控件定义快捷键,那么,当按下该键时会自动触发菜单控件的 Click 事件而不是键事件。
同样,如果在窗体上有一个命令按钮,其 Default 属性被设置为 True,则 ENTER 键将触发此命令按钮的 Click 事件而不是键事件。如果将命令按钮的 Cancel 属性设置为 True,则 ESC 键将触发按钮的 Click 事件而不是键事件。
例如,如果将 Click 事件过程添加到 CommandButton,然后将 Default 或 Cancel 属性设置为 True,则按下 RETURN 或 ESC 键时,KeyDown 事件会遭到拒绝。以下过程关闭应用程序:
Private Sub Command1_Click()
End
End Sub
注意,除非窗体上的每个控件都无效或其 TabStop 属性都为 False,否则,TAB 键会将焦点从一个控件移动到另一个控件而不触发击键事件。
当把窗体的 KeyPreview 属性设置为 True 时,窗体在控件之前识别键盘事件,但对控件来说事件仍然会发生。为防止这种情况,可将窗体键盘事件过程中的 keyascii 或 keycode 设置为 0。例如,如果在窗体上没有缺省按钮,则可用 ENTER 键将焦点从一个控件移动到另一个控件:
Private Sub Form_KeyPress (KeyAscii As Integer)
Dim NextTabIndex As Integer, i As Integer
If KeyAscii = 13 Then
If Screen.ActiveControl.TabIndex = _
Count - 1 Then
NextTabIndex = 0
Else
NextTabIndex = Screen.ActiveControl._
TabIndex + 1
End If
For i = 0 To Count - 1
If Me.Controls(i).TabIndex = _
NextTabIndex Then
Me.Controls(i).SetFocus
Exit For
End If
Next i
KeyAscii = 0
End If
End Sub
因为在 keyascii 等于 13 时,代码将其设置为 0,所以控件从不识别按下的 ENTER 键,而控件的键盘事件也从不被调用。