Поделиться через


Как определить, какая клавиша-модификатор была нажата

При создании приложения, которое принимает нажатия клавиш пользователя, также может потребоваться отслеживать ключи модификатора, такие как клавиши SHIFT, ALT и CTRL. Если клавиша модификатора нажимается в сочетании с другими ключами или щелчками мыши, приложение может реагировать соответствующим образом. Например, если нажата буква S, это может просто привести к отображению "s" на экране, но если клавиши CTRL+S нажимаются, текущий документ может быть сохранен. Если вы обрабатываете событие KeyDown, обработчик событий получает объект KeyEventArgs, свойство Modifiers которого указывает, какие клавиши модификатора нажаты. Альтернативно, свойство KeyDataKeyEventArgs указывает символ, который был нажат, а также любые клавиши модификатора, объединенные битовым оператором ИЛИ. Однако если вы обрабатываете событие KeyPress или событие мыши, обработчик событий не получает эти сведения. В этом случае необходимо использовать свойство ModifierKeys класса Control. В любом случае необходимо выполнить побитовое И соответствующего значения Keys и значения, которое вы тестируете. Перечисление Keys предлагает варианты каждого ключа модификатора, поэтому важно выполнить побитовое И с правильным значением. Например, клавиша SHIFT представлена как Shift, ShiftKey, RShiftKey и LShiftKey, и правильное значение для проверки SHIFT в качестве модифицирующей клавиши — Shift. Аналогичным образом для проверки клавиш CTRL и ALT в качестве модификаторов следует использовать значения Control и Alt соответственно.

Заметка

Программисты Visual Basic также могут получить доступ к ключевым сведениям через свойство Keyboard

Для определения, какая клавиша модификатора была нажата

  • Используйте побитовый оператор AND с свойством ModifierKeys и значением перечисления Keys, чтобы определить, нажата ли определенная клавиша-модификатор. В следующем примере кода показано, как определить, нажимается ли клавиша SHIFT в обработчике событий KeyPress.

    private:
        void textBox1_KeyPress(Object^ sender, KeyPressEventArgs^ e)
        {
            if ((Control::ModifierKeys & Keys::Shift) == Keys::Shift)
            {
                MessageBox::Show("Pressed " + Keys::Shift.ToString());
            }
        }
    
    public void TextBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
        {
            MessageBox.Show("Pressed " + Keys.Shift);
        }
    }
    
    Public Sub TextBox1_KeyPress(ByVal sender As Object, _
        ByVal e As KeyPressEventArgs) Handles TextBox1.KeyPress
    
        If ((Control.ModifierKeys And Keys.Shift) = Keys.Shift) Then
            MsgBox("Pressed " + Keys.Shift.ToString())
        End If
    End Sub
    

См. также