Как проверить нажатие клавиши-модификатора (Windows Forms .NET)

Когда пользователь нажимает клавиши в приложении, можно отслеживать нажатия клавиш-модификаторов, таких как SHIFT, ALT и CTRL. При нажатии клавиши-модификатора в сочетании с другими клавишами или даже при щелчке мышью приложение может реагировать соответствующим образом. Например, нажатие клавиши S может привести к отображению "S" на экране. Если нажать клавиши CTRL+S, можно сохранить текущий документ.

Важно!

Документация по рабочему столу для .NET 7 и .NET 6 находится в стадии разработки.

При обработке события KeyDown свойство KeyEventArgs.Modifiers, полученное обработчиком событий, указывает, какие клавиши-модификатора нажаты. Кроме того, свойство KeyEventArgs.KeyData указывает символ, который был нажат вместе с любыми клавишами-модификаторами в сочетании с побитовым оператором "ИЛИ".

Если вы обрабатываете событие KeyPress или событие мыши, обработчик событий не получает эти сведения. Используйте свойство ModifierKeys класса Control для обнаружения клавиши-модификатора. В любом случае необходимо выполнить побитовый оператор "И" для соответствующего значения Keys и проверяемого значения. Перечисление Keys предлагает различные варианты для каждой клавиши-модификатора, поэтому важно выполнить проверку побитового оператора "И" на предмет наличия правильного значения.

Например, клавиша SHIFT представлена следующими значениями:

Правильное значение для проверки SHIFT в качестве клавиши-модификатора — Keys.Shift. Аналогичным образом, для проверки CTRL и ALT в качестве модификаторов следует использовать значения Keys.Control и Keys.Alt соответственно.

Определение клавиши-модификатора

Определите, нажата ли клавиша-модификатор, сравнив свойство ModifierKeys и значение перечисления Keys с побитовым оператором "И".

В следующем примере кода показано, как определить, нажата ли клавиша 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

См. также