Как проверить нажатие клавиши-модификатора (Windows Forms .NET)
Когда пользователь нажимает клавиши в приложении, можно отслеживать нажатия клавиш-модификаторов, таких как SHIFT, ALT и CTRL. При нажатии клавиши-модификатора в сочетании с другими клавишами или даже при щелчке мышью приложение может реагировать соответствующим образом. Например, нажатие клавиши S может привести к отображению "S" на экране. Если нажать клавиши CTRL+S, можно сохранить текущий документ.
При обработке события 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
См. также
.NET Desktop feedback