BillWoodruff
Есть еще один способ сделать это в WinForms без необходимости переопределять 'ProcessCommandKey, устанавливать Form' KeyPreView в 'true и т. д.; Это немного "хакерски", но я надеюсь, что это завершит обсуждение здесь.
1. Поместите MenuStrip в форму: если вы не хотите использовать MenuStrip для отображения некоторых пунктов меню, установите для его свойства Visible значение false.
2. Добавьте ToolStripMenuItem в MenuStrip обычным способом. Установите его ShortCutKeys на комбинацию клавиш, которую вы хотите вызвать событие. Установите для его свойства Visible значение false.
3. Добавьте обработчик событий Click в ToolStripMenuItem и напишите код, который вы хотите выполнить, когда произойдет щелчок.
Пример:
Я добавляю MenuStrip, " menuStrip11. Я добавляю ToolStripMenuItem, ' AltF4ShortCut с комбинацией клавиш, установленной на 'Alt и' F4. В представлении конструктора формы вы увидите:
// AltF4ShortCut
//
this.AltF4ShortCut.Name = "AltF4ShortCut";
this.AltF4ShortCut.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4)));
this.AltF4ShortCut.Size = new System.Drawing.Size(52, 24);
this.AltF4ShortCut.Text = "Save";
this.AltF4ShortCut.Visible = false;
this.AltF4ShortCut.Click += new System.EventHandler(this.AltF4ShortCut_Click);
Теперь обработчик событий Click будет срабатывать независимо от того, какой элемент управления имеет фокус в форме времени выполнения; я мог бы установить текущий фокус на текстовое поле на панели в UserControl, и он все равно будет срабатывать.
Вот как может выглядеть обработчик событий Click:
private void AltF4ShortCut_Click(object sender, EventArgs e)
{
if (MessageBox.Show(
"Save now ?",
"Save Data",
MessageBoxButtons.OKCancel,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button1,
MessageBoxOptions.DefaultDesktopOnly
)
== DialogResult.OK)
{
// code to save goes here
}
}
Я думаю, что можно с уверенностью предположить, что приложение WinForm с пунктом меню с определенными комбинациями клавиш быстрого доступа устанавливает свой собственный обработчик нижних рычагов для событий клавиатуры, возможно, даже используя то, что ProcessCmdKey over-ride использует под капотом (может быть, WndProc ?).