Захват событий нажатия клавиш на уровне приложения WPF

Я пытаюсь фиксировать события нажатия клавиш в любом месте моего приложения WPF, независимо от того, какой элемент пользовательского интерфейса имеет фокус. В настоящее время мне не везет. Может ли кто-нибудь предложить некоторые стратегии, которые я, возможно, не пробовал? Или, в идеале, ответьте, например, «о, это просто, просто сделайте это»

. Это распределенное приложение, в котором есть система чата. Эффект, который я ищу, заключается в том, что пользователь может начать вводить сообщение чата в любое время, не переключаясь на стандартное окно чата. Я сам выведу их сообщение в приложении, с использованием объектов FormattedText. Это важно, потому что это означает, что в приложении нигде нет элементов ввода текста.

Моя структура XAML выглядит примерно так:

<MainWindow>
  <Canvas 1>
    <Canvas 2>
      <Image 1 />
    </Canvas 2>
    <Image 2 />
  </Canvas 1>
</MainWindow>

Я программно добавляю элементы в Canvas 2 и манипулирую Image 2, поэтому оно имеет такую ​​структуру .

Я пробовал добавить события KeyDown, KeyUp и Preview в MainWindow и Canvas 1, но ни одно из них не срабатывает (я проверяю с помощью точек останова). Я также, прочитав здесь другой связанный вопрос, попытался вручную установить фокус на главном окне в методе Loaded ().

Я понимаю, что на этом сайте есть много связанных вопросов, но они мне не помогли, потому что :

  • нет ' t какие-либо ответы (будет ли ответ на мой вопрос?)
  • они предполагают наличие виджета ввода текста и заинтересованы в всплытии событий
  • они хотят привязку клавиш для небольшого количества ключей - я хотел бы захватить любой ключ
  • они заинтересованы в том, чтобы определить, нажата ли клавиша control / shift / alt после того, как они уже зафиксировали событие

Спасибо, что нашли время, чтобы прочитать мой длинный пост, и спасибо за предложения.

Обновить (после комментария Рэйчел) Когда я вставляю TextBox и устанавливаю фокус на TextBox, срабатывает метод ключевого события на уровне MainWindow. Так что это работает так, как рекламируется.

Однако мне бы очень хотелось вообще не иметь явного виджета ввода текста в приложении. Я бы хотел, чтобы пользователь мог просто начать печатать, чтобы составить сообщение.

9
задан cursa 3 December 2010 в 19:22
поделиться