Я разработал приложение Windows Forms (.NET 4.6, VS.2017), и у меня есть две формы: основная и немодальная. В обеих формах мне нужно поймать пользователя, нажимающего клавишу F2. Кстати, это единственная функциональная клавиша, используемая приложением, никакое другое сочетание клавиш не определено ни для какой другой функциональной клавиши.
В обеих формах я включил Form.KeyPreview, что по умолчанию равно false. Затем я также реализовал событие KeyDown и в нем проверяю, является ли это моей функциональной клавишей:
private void myView_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.F2) // breakpoint placed here!
{
// perform action
e.Handled = true;
}
}
Обратите внимание, что я поместил точку останова на оператор IF, проверяющий, какая клавиша была нажата, а не внутри блока действий.
Теперь в моей немодальной форме это работает абсолютно нормально, независимо от того, какую функциональную клавишу я выбираю.
Однако основная форма демонстрирует странное поведение с тем же кодом. Если в основной форме я использую «e.KeyCode == Keys.F3», то точка останова срабатывает для всех других нажатых функциональных клавиш, КРОМЕ F3.
Итак, затем я изменил оператор if, чтобы вместо этого проверять F2, а не F3. Но теперь с этим изменением точка останова срабатывает для всех функциональных клавиш, кроме F2, поэтому F3, которая раньше не работала (при проверке F3), теперь работает, а F2 — нет.
Неважно, какую функциональную клавишу я выбрал, точка останова сработает для ВСЕХ функциональных клавиш, КРОМЕ той, которую я выбрал.
Вот в чем загвоздка... В одном из моих элементов ToolStripMenuItems я также поместил ту же функциональную клавишу в качестве ярлыка, потому что они выполняют одно и то же действие (тогда пользователю не нужно нажимать Alt G, а затем Alt что-то еще, а вместо этого использовать F2 напрямую.
Итак, если я удалю ярлык из ToolStripMenuItem, моя форма KeyDown будет работать, как и ожидалось, НО тогда у пользователя нет визуального намека на то, что он может использовать F2 для выполнения этой функции. Странно здесь еще и то, что ни пункт меню toolstrip, ни форма не реагируют на выбранную функциональную клавишу.
Что я могу сделать, чтобы ярлык работал как для элемента меню панели инструментов, так и на уровне формы?