当用户在应用程序中键入键时,可以监视按下的修饰键,例如 SHIFT、 Alt 和 Ctrl。 当修饰键与其他键或鼠标单击结合使用时,应用程序可以相应地做出响应。 例如,按 S 键可能会导致屏幕上显示“s”。 如果按下Ctrl+S键,则可能会保存当前文档。
如果您处理 KeyDown 事件,则事件处理程序收到的 KeyEventArgs.Modifiers 属性会指定按下了哪些功能键。 此外,KeyEventArgs.KeyData 属性指定了按下的字符以及通过按位 OR 组合的任何修饰键。
如果要处理 KeyPress 事件或鼠标事件,事件处理程序不会收到此信息。 使用Control类的ModifierKeys属性来检测键修饰符。 在任一情况下,都必须对适当的 Keys 值和要测试的值执行按位 AND。 枚举 Keys 提供每个修饰键的变体,因此请务必按位执行 AND 检查正确的值。
例如,以下键值表示 SHIFT 键:
测试 SHIFT 作为修饰键的正确值是 Keys.Shift。 同样,若要测试 CTRL 和 ALT 作为修饰符,应分别使用 Keys.Control 和 Keys.Alt 值。
检测修饰键
通过将ModifierKeys属性与Keys枚举值使用按位 AND 运算符比较,来检测是否有修饰键被按下。
下面的代码示例演示如何确定SHIFT键是否在KeyPress事件处理程序和KeyDown事件处理程序中被按下。
// Event only raised when non-modifier key is pressed
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
MessageBox.Show("KeyPress " + Keys.Shift);
}
// Event raised as soon as shift is pressed
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
MessageBox.Show("KeyDown " + Keys.Shift);
}
' Event only raised when non-modifier key is pressed
Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs)
If ((Control.ModifierKeys And Keys.Shift) = Keys.Shift) Then
MessageBox.Show("KeyPress " & [Enum].GetName(GetType(Keys), Keys.Shift))
End If
End Sub
' Event raised as soon as shift is pressed
Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs)
If ((Control.ModifierKeys And Keys.Shift) = Keys.Shift) Then
MessageBox.Show("KeyPress " & [Enum].GetName(GetType(Keys), Keys.Shift))
End If
End Sub