К сожалению, вы не можете сделать это напрямую. Параметр event
обработчика MenuItem click
не имеет свойства, которое указывает, было ли действие вызвано с помощью мыши или клавиатуры.
Обход
Однако вы можете, конечно, использовать обходной путь, используя тот факт, что если функция меню запускается с помощью сочетания клавиш, нажатие клавиши (клавиш) может быть одновременно зафиксировано в процессе рендерера с использованием keydown
событие.
В простейшем виде вы можете отслеживать все вызовы в функции меню, т.е. независимо от того, были ли они вызваны с помощью мыши или клавиатуры. Параллельно вы слушаете те же ярлыки в вашем рендерере. Каждый раз, когда обнаруживается ярлык, который также является ускорителем в вашем меню, вы делаете это на заметку.
Пример
Если предположить сценарий, в котором вы используете мышь, чтобы щелкнуть действие, затем использовать ярлык, а затем снова мышь, отслеживаемые события будут:
# time event
1 t0 Menu item action (Using mouse)
2 t1 Menu item action (Using keyboard shortcut)
3 ~t1 Keyboard shortcut detected
4 t2 Menu item action (Using mouse)
Если у вас есть такие данные, вы можете посчитать количество появлений «Действие пункта меню» (здесь 3) и «Обнаружено сочетание клавиш» (здесь 1). Затем вы знаете, что 1 из 3 раз действие меню вызывалось с помощью сочетания клавиш.
Downsides
Недостатки этого обходного пути:
- Дублированный код для ускорителей меню и ключевого слушателя
- Генерация двух событий при использовании клавиатуры
Можно подумать о возможных способах устранения этих недостатков, в зависимости от вашего конкретного случая использования.