Отвечая на вопрос аккордов клавиатуры , в частности, я не верю, что на данный момент вам доступна готовая опция.
Однако это должно быть достаточно просто для моделирования. Я бы создал один класс, возможно KeyboardChordProvider
. Он должен знать о событиях клавиатуры на уровне формы. Как указано в другом месте, свойство Form.KeyPreview
должно быть true
. Этого поставщика может быть достаточно, чтобы подписаться на событие Form.KeyPress
. Вы можете сделать все это в конструкторе провайдера, если передадите форму.
Вам необходимо зарегистрировать возможные нажатия клавиш у провайдера.
Внутренне этот экземпляр будет отслеживать текущее состояние. Всякий раз, когда наблюдается нажатие клавиши, представляющее первую клавишу аккорда, вы обновляете состояние провайдера и инициируете событие, чтобы подписчик мог задать текст: (CTRL + W) была нажата. В ожидании второго ключа аккорда ...
Если следующее нажатие клавиши соответствует потенциальной вторичной опции, тогда у вас есть совпадение и вы можете вызвать событие ChordPressed
, содержащее детали введенных штрихов. В качестве альтернативы вы можете просто вызвать конкретный обратный вызов, который был предоставлен провайдеру во время регистрации аккорда (чтобы не было оператора switch или какой-либо другой диспетчеризации в обработчике события ChordPressed
).
Если в любое время нажатие клавиши не соответствует потенциальной опции next , вы сбросите состояние провайдера.
Внутри поставщика вы можете смоделировать возможные нажатия клавиш, используя древовидную структуру. Текущее состояние провайдера - это просто определенный узел дерева. Сначала корневой узел будет активным. Если дочерний элемент соответствует нажатию клавиши, он становится текущим узлом в ожидании следующего удара. Если дочерний узел был листовым узлом, то соответствовал весь аккорд, и вы вызывали бы событие ChordPressed
(передавая цепочку штрихов, которые привели вас к этой точке) или вызывали обратный вызов, сохраненный в листе. Всякий раз, когда ни одно нажатие клавиши не соответствует дочернему, вернитесь к активному корневому узлу.
Я думаю, этот дизайн достиг бы того, что вы хотите.