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

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

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

12
задан Peter Mortensen 16 July 2011 в 10:14
поделиться

3 ответа

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

Из MSDN :

Метод ProcessCmdKey сначала определяет, есть ли у элемента управления ContextMenu, и если да, то позволяет контекстному меню обработайте клавишу command . Если командная клавиша не является ярлыком меню и у элемента управления есть родительский элемент, ключ передается родительскому методу 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);
}
15
ответ дан 2 December 2019 в 18:18
поделиться

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

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;
    }
}
4
ответ дан 2 December 2019 в 18:18
поделиться

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

1
ответ дан 2 December 2019 в 18:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: