Подтвердить что ты не робот

Горячая клавиша (не глобальная) в Windows Forms.NET

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

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

4b9b3361

Ответ 1

Вы можете переопределить 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);
}

Ответ 2

Вы можете переопределить метод FormCmdKey(), он запускается до того, как любой элемент управления формы увидит ход клавиши. Если вам действительно нужно, чтобы это было на уровне приложения (все формы), тогда у вас должна быть ваша основная форма, реализующая интерфейс 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;
    }
}

Ответ 3

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