Вы можете определить «базовую» форму с помощью реализованного обработчика ProcessCmdKey, а затем создать все остальные формы: родительский MDI, дочерний Windows родительского MDI и любые созданные вами «независимые» формы (т. Е. Не дочерние) формы MDI) наследуются от «базовой формы». Просто убедитесь, что свойство IsMdiContainer установлено в форме, которую вы хотите использовать в качестве MDI, и что дочерние окна, которые вы добавляете в форму MDI, не являются TopLevel и их родительский элемент установлен в форму MDI.
Тогда возникает вопрос, где вы хотите обрабатывать события, запускаемые комбинациями клавиш, которые вы включили, потому что ... если вы определяете методы, которые должны запускаться комбинациями клавиш, попадающими в ловушку, в базовой форме ... каждый Форма, которая наследуется от базовой формы, будет выполнять их в своем собственном контексте.
Если вы хотите обрабатывать захваченные комбинации клавиш на уровне приложения, то реализуйте статический открытый класс с обработчиками комбинаций клавиш, определенными как статические методы. Или, так как вы можете захотеть узнать, из какой формы выдается специальная комбинация клавиш, просто передайте указатель на вызывающую форму в статический обработчик.
Итак, ваш обработчик для элемента управления + Tab в переопределении ProcessCmdKey в базовой форме может выглядеть следующим образом:
// in ProcessCmdKey override in base Form
case Keys.Control | Keys.Tab:
KeyHandler.NextTabHandler(this);
return true;
Ваш статический класс может выглядеть примерно так:
public static class KeyHandler
{
public static void NextTabHandler(Form theCallingForm)
{
Console.WriteLine("called from : " + theCallingForm.Text + " : ActiveControl : " + theCallingForm.ActiveControl.Name);
if (theCallingForm is MDIForm)
{
// handle Next Tab on MDIForm control
}
else if (theCallingForm is childForm)
{
// handle Next Tab on ChildForm control
}
else
{
if(theCallingForm is independentForm)
{
// handle Next Tab on "independent Form" control
}
}
}
}
Как видно из приведенного выше кода, вы можете использовать свойство ActiveControl вызывающей формы, чтобы узнать, какой элемент управления в данном типе формы получил комбинацию клавиш.
Конечно, если вы не хотите обрабатывать комбинации клавиш «глобально», как это, просто вставьте переопределения ProcessCmdKey, как это необходимо в других формах, и не позволяйте им наследовать от базовой формы .
Обработка ключевых событий «на уровне приложения» может или не может быть лучшей стратегией для вашего конкретного решения, но это жизнеспособная стратегия. лучший