如何检查按下的修改键(Windows 窗体 .NET)

当用户在应用程序中键入键时,可监视按下的修改键,如 SHIFTALTCTRL。 当修改键与其他键甚至是鼠标单击一起按下时,应用程序可以相应地做出响应。 例如,按 S 键可能会在屏幕上显示一个“s”。 如果按下键 CTRL+S,可能会保存当前文档。

如果处理 KeyDown 事件,事件处理程序收到的 KeyEventArgs.Modifiers 属性将指定按下的修改键。 此外,KeyEventArgs.KeyData 属性指定与按位 OR 组合的所有修改键一起按下的字符。

如果要处理 KeyPress 事件或鼠标事件,事件处理程序不会收到此信息。 使用 Control 类的 ModifierKeys 属性来检测修改键。 在任一情况下,都必须对相应的 Keys 值和要测试的值执行按位 AND。 Keys 枚举提供每个修改键的变体,因此,请务必使用正确的值执行按位 AND 检查。

例如,SHIFT 键由以下键值表示:

SHIFT 作为修改键进行测试的正确值是 Keys.Shift。 同样,若要将 CTRLALT 作为修改键进行测试,应分别使用 Keys.ControlKeys.Alt 值。

检测修改键

通过将 ModifierKeys 属性和 Keys 枚举值与按位 AND 运算符进行比较,检测是否已按下修改键。

下面的代码示例演示如何确定在 KeyPressKeyDown 事件处理程序中是否按下了 SHIFT 键。

// 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

另请参阅