Горячая клавиша (не глобальная) в Windows Forms .NET - PullRequest
12 голосов
/ 07 мая 2010

В моем приложении Windows Forms мне бы хотелось, чтобы одна специальная кнопка запускала тест при каждом нажатии. Существуют десятки элементов управления, поэтому внедрение каждого из них занимает слишком много времени.

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

Ответы [ 3 ]

15 голосов
/ 07 мая 2010

Вы можете переопределить ProcessCmdKey и обрабатывать свои горячие клавиши там, либо в элементе управления, либо в форме.

С MSDN :

Метод ProcessCmdKey первым определяет, имеет ли элемент управления ContextMenu, и если это так, включает ContextMenu для обработки команды ключ. Если командная клавиша не является меню ярлык и элемент управления имеет родителя, ключ передается родителю Метод ProcessCmdKey. Чистый эффект является то, что командные клавиши "пузырились" вверх иерархия управления. В дополнение к ключ, который пользователь нажал, ключ данных также указывает, какой, если таковой имеется, модификатор клавиши были нажаты одновременно ключ. Клавиши-модификаторы включают в себя Клавиши SHIFT, CTRL и ALT.

Например:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    // if it is a hotkey, return true; otherwise, return false
    switch (keyData)
    {
        case Keys.Control | Keys.C:
            // do something
            return true;
        default:
            break;
    }

    return base.ProcessCmdKey(ref msg, keyData);
}
4 голосов
/ 07 мая 2010

Вы можете переопределить метод ProcessCmdKey () формы, он запускается до того, как любой элемент управления в форме увидит нажатие клавиши.Если вам действительно нужно, чтобы это было на уровне приложения (все формы), тогда ваша основная форма должна реализовывать интерфейс IMessageFilter.Например:

public partial class Form1 : Form, IMessageFilter {
    public Form1() {
        InitializeComponent();
        Application.AddMessageFilter(this);
        this.FormClosed += (o, e) => Application.RemoveMessageFilter(this);
    }
    public bool PreFilterMessage(ref Message m) {
        // Catch WM_KEYDOWN message
        if (m.Msg == 0x100 && (Keys)m.WParam == Keys.F1) {
            MessageBox.Show("Help me!");
            return true;
        }
        return false;
    }
}
1 голос
/ 07 мая 2010

Если у вас есть только одна форма. Вы можете установить Form.KeyPreview = true, а затем добавить код к ключевому событию формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...