Как предотвратить обработку командных ключей с помощью формы размещения, когда элемент управления имеет фокус - PullRequest
1 голос
/ 27 марта 2012

Я ищу способ отмены нажатий клавиш или командных клавиш (например, F1 или CTRL + O), когда элемент управления находится в фокусе. По возможности на контрольном уровне.

Представьте, что у меня есть элемент управления (простое текстовое поле, например), размещенный на форме. Я установил сочетания клавиш для таких команд, как «Открыть» (CTRL + O) или «Справка» (F1). Если элемент управления имеет фокус клавиатуры, и я нажимаю одну из команд, я хочу предотвратить выполнение команды быстрого вызова.

Я бы предпочел решение, где я мог бы обрабатывать эти нажатия клавиш и предотвращать их "пузыриться" на уровне управления, а не на уровне формы.

Ответы [ 4 ]

2 голосов
/ 28 марта 2012

Единственное решение, которое я нашел, было реализовать / переопределить функцию ProcessCmdKey на уровне управления:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData >= Keys.F1 && keyData <= Keys.F24)
    {
        WndProc(ref msg);
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

Мне также нужно было удалить все сочетания клавиш из моей основной формы и реализовать такой же способ их обработки.

2 голосов
/ 27 марта 2012

Вы можете использовать KeyDown-событие:

    void DropDownBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
    {
        switch (e.KeyCode)
        {
            case Keys.Down:
            case Keys.Up:
                ShowPopup();
                e.SuppressKeyDown = true; // Don't pass it to the underlying control
                break;
        }
    }

Если этого недостаточно - например, переопределение Tab или любое другое базовое нажатие, вот очень хорошая статья об обработке клавиш

1 голос
/ 27 марта 2012

Использовать e.SuppressKeyPress = true; в событии keydown: я создал ключ доступа для флажка как ALT + C, и он работает хорошо.

 private void cboViewType_KeyDown(object sender, KeyEventArgs e)
        {
            if ((Control.ModifierKeys & Keys.Control) == Keys.Control || e.KeyCode == Keys.F1 || ((Control.ModifierKeys & Keys.Alt) == Keys.Alt && e.KeyCode == Keys.C))
            {
                // do whatever you want to do here...
                MessageBox.Show("key overridden");
                e.SuppressKeyPress = true;
            }
            //e.Handled = true;   // will not work for overriding the shortcut etc.
        }

Ref: Переопределение клавиш ShortCut в .NETRichTextBox

0 голосов
/ 27 марта 2012

Вы можете прекратить "пузыриться" для большинства событий клавиатуры, установив KeyEventArgs.Handled = true в обработчике событий KeyDown любого фокусируемого элемента управления.Он перехватывает ALT-F4 или F1, но не перехватывает системные комбинации, такие как ALT-TAB.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        e.Handled = true;
    }
}
...