KeyPress 事件发生在当窗体或控件获得焦点,然后用户按下并释放一个对应 ANSI 代码的键或组合键时。如果在宏中使用 SendKeys 操作,或者在 Visual Basic 中使用 SendKeys 语句将 ANSI 键击发送到窗体或控件时,该事件也将发生。
Private Sub object_KeyPress(KeyAscii As Integer)
Object 窗体或窗体上控件的名称。
KeyAscii 返回数字 ANSI 键代码。KeyAscii 参数通过引用传递,更改它可将不同字符发送给对象。将 KeyAscii 参数设为 0 可取消键击,这样,对象便不会认为已按了某个键。
注释 KeyPress 事件仅适用于窗体和窗体上的控件,不适用于报表上的控件。
若要在该事件发生时运行宏或事件过程,请将 OnKeyPress 属性设为宏的名称或 [事件过程]。
获得焦点的对象将接收到所有的键击,而窗体只有在它没有控件或它所有可见的控件都失效时才能获得焦点。
如果将窗体的 KeyPreview 属性设为“是”,窗体也能接收到所有的键盘事件,甚至包括那些对控件发生的键盘事件。通过设置该属性值,所有键盘事件将首先在窗体上发生,然后在获得焦点的控件上发生。无论哪个控件获得焦点,都可以在窗体中对按下的特定键作出响应。例如,可以让组合键 Ctrl+X 总在窗体上执行相同的操作。
如果按住一个 ANSI 键不放,KeyDown 和 KeyPress 事件将交替重复发生(KeyDown、KeyPress、KeyDown、KeyPress,以此类推)直到按键被释放,然后 KeyUp 事件发生。
KeyPress 事件能包含任一可打印的键盘字符,如 Ctrl 和标准字母或特殊字符的组合键,以及 Enter 或 Backspace。可以使用 KeyDown 和 KeyUp 事件过程来处理所有 KeyPress 事件不能识别的键击,例如功能键、定位键及这些键和键盘修改键的任意组合(加上 Alt、Shift 或 Ctrl)。与 KeyDown 和 KeyUp 事件不同的是,KeyPress 事件不会指出键盘的物理状态,它只能指出对应于按键或组合键的 ANSI 字符。
KeyPress 将每一字符的大写和小写解释为不同的键代码,因此每一字符都可以作为两个字符来看待。
注释 Backspace 是 ANSI 字符集的一部分,但是 Del 不是。如果使用 Backspace 来删除控件中的字符,将会导致 KeyPress 事件发生,而使用 Del 删除将不会触发该事件。
在按下或发送 ANSI 键时 KeyDown 和 KeyPress 事件发生。KeyUp 事件则发生在按键或发送键所引起的任一事件之后。如果击键使焦点从一个控件移动到另一个控件,则在第一个控件上 KeyDown 事件发生,而在第二个控件上 KeyPress 和 KeyUp 事件发生。
例如,如果移到一个新记录并在记录的第一个控件中键入字符,则下列事件发生:
Current(对新记录) ==>
Enter(对新记录中的第一个控件) ==>
GotFocus(对控件) ==>
KeyDown(对控件) ==>
KeyPress(对控件) ==>
BeforeInsert(对窗体中的新记录) ==>
Change(如果是文本框或组合框的控件) ==>
KeyUp (对控件)
有关详细信息,请参阅击键事件和鼠标单击事件的发生顺序。
ß
BeforeInsert(表单中的新记录)
ß
Change(对文本框或组合框控件)
ß
KeyUp(对控件)
如果焦点位于窗体或控件上,那么无论用户何时按 ANSI 键,都可以使用 KeyPress 宏进行响应。但是,宏无法返回 ANSI 键代码和确定按了哪个键,因此通常要用事件过程处理这些事件。
可以在 KeyPress 宏中使用 CancelEvent 操作来取消键或键组合。例如,在某些条件下,可能需要禁止在控件中输入 ANSI 键击。
以下示例将文本框中输入的文本在键入时转换为大写,每键入一个字符就转换一个。
若要试用该示例,请将下列事件过程添加到窗体中,并使窗体中含有一个名为“货主地区”的文本框。
Private Sub ShipRegion_KeyPress(KeyAscii As Integer)
Dim strCharacter As String
' Convert ANSI value to character string.
strCharacter = Chr(KeyAscii)
' Convert character to upper case, then to ANSI value.
KeyAscii = Asc(UCase(strCharacter))
End Sub