Горячая клавиша (не глобальная) в Windows Forms.NET
В моем приложении Windows Forms я хотел бы, чтобы одна специальная кнопка запускала тест каждый раз, когда я нажимаю его. Есть десятки элементов управления, поэтому их реализация в каждом занимает слишком много времени.
Есть ли способ установить горячую клавишу так, независимо от того, что я делаю в приложении, я могу нажать клавишу, и она погасит мое событие?
Ответы
Ответ 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, а затем добавить код в событие формы.