Невозможно обнаружить комбинацию клавиш Ctrl + Key при событиях keydown, когда имеется текстовое поле readonly с фокусом

Я думал, что решил эту проблему сам, но она вернулась, чтобы преследовать мое приложение, поэтому вот оно:

У меня есть следующий обработчик событий keydown, зарегистрированный в форме с несколькими отключенными и текстовыми полями только для чтения, и это только простые клавиши для кнопок:

private void AccountViewForm_KeyDown(object sender, KeyEventArgs e)
    {
        //e.SuppressKeyPress = true;
        //e.Handled = true;
        if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.E && !isInEditMode)
            btnEditMode_Click(sender, e);
        if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.S && isInEditMode) btnEditMode_Click(sender, e);
        if (e.KeyCode == Keys.Escape) btnCancel_Click(sender, e);
        if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.W) Close();
    }

форма имеет значение KeyPreview для true, но всякий раз, когда текстовое поле readonly имеет фокус, и я нажимаю Ctrl + E, я не могу получить "Control.ModifierKeys == Keys.Control" и "e.KeyCode == Keys.E" на одновременно быть истинными. Странно, что Ctrl + W работает. Кто-нибудь знает, что, черт возьми, происходит?: (

Ответ 1

В соответствии с этот вопрос и этот, он выглядит как более общий способ обработки сочетаний клавиш заключается в переопределении метода ProcessCmdKey():

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
  if (keyData == (Keys.Control | Keys.F)) {
    MessageBox.Show("What the Ctrl+F?");
    return true;
  }
  return base.ProcessCmdKey(ref msg, keyData);
}

Считаете ли вы использование Alt + E и Alt + S и просто установление мнемонического свойства для ваших кнопок? Кажется, это хорошо работает для меня, и это проще настроить.