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