Я пытаюсь перехватить события нажатия клавиш в любом месте моего приложения WPF, независимо от того, какой элемент пользовательского интерфейса имеет фокус.На данный момент мне не везет.Кто-нибудь может предложить некоторые стратегии, которые я, возможно, не пробовал?Или, в идеале, предоставьте ответ типа «о, это просто, просто сделай это».
Это распределенное приложение с системой чата.Эффект, который я ищу, состоит в том, что пользователь может начать вводить сообщение чата в любое время, не переключаясь на стандартное окно чата.Я покажу их сообщение в приложении, используя объекты FormattedText.Это важно, потому что это означает, что в приложении больше нет элементов ввода текста.
Моя структура XAML выглядит примерно так:
<MainWindow>
<Canvas 1>
<Canvas 2>
<Image 1 />
</Canvas 2>
<Image 2 />
</Canvas 1>
</MainWindow>
Я программно добавляю элементы в Canvas 2 и манипулирую имиджем2, именно поэтому он имеет такую структуру.
Я пытался добавить события KeyDown, KeyUp и Preview в MainWindow и Canvas 1, но ни одно из них, похоже, не срабатывает (я проверяю с помощью точек останова).Я также, после прочтения еще одного связанного вопроса, попытался вручную установить фокус на главном окне в методе Loaded ().
Я понимаю, что на этом сайте есть много связанных вопросов, но они непомог мне, потому что:
- ответов нет (ответ на мой вопрос?)
- они принимают виджет ввода текста и заинтересованы в всплывающих событиях
- они хотят связать клавиши для небольшого количества ключей - я хотел бы захватить любую клавишу
- они заинтересованы в обнаружении, не работает ли клавиша управления / Shift / Alt после того, как они уже захватили событие
Спасибо, что нашли время, чтобы прочитать мой длинный пост, и спасибо за предложения.
Обновление (После комментария Рэйчел) Когда я вставляюTextBox и установите фокус на TextBox, сработает метод ключевого события на уровне MainWindow.Так что это работает так, как рекламируется.
Однако мне бы очень хотелось, чтобы в приложении вообще не было виджета для ввода текста.Я бы хотел, чтобы пользователь мог просто начать печатать сообщение.