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

当用户在应用程序中键入键时,可以监视按下的修饰键,例如 SHIFTALTCTRL。 当修饰键与其他键或鼠标单击结合使用时,应用程序可以相应地做出响应。 例如,按 S 键可能会导致屏幕上显示“s”。 如果按下 Ctrl+S 键,当前文档可能会被保存。

如果您处理 KeyDown 事件,那么事件处理程序收到的 KeyEventArgs.Modifiers 属性将指定被按下的修饰键。 此外,KeyEventArgs.KeyData 属性指定与按位 OR 组合的任何修饰键一起按下的字符。

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

例如,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

另请参阅