слушать ключ, когда приложение не сфокусировано

У меня есть приложение (С# 4.0-WPF), которое скрыто и может отображаться, щелкнув значок на панели задач или другой созданный мной фрейм (маленький фрейм, который закреплен слева и сверху).

Мой клиент хочет добавить новый способ отображения приложения: при нажатии клавиши «F» (например, F9).

Как я узнаю в своем приложении, нажимает ли пользователь эту клавишу, когда приложение не является текущим окном/или не сфокусировано?


person J4N    schedule 21.02.2011    source источник


Ответы (1)


Глобальные перехваты клавиатуры не являются правильным решением, если вам нужно всего несколько глобальных горячих клавиш.

  • Глобальный хук клавиатуры с использованием WH_KEYBOARD означает, что ваша dll будет внедрена в каждый процесс, который получает нажатия клавиш. Его вообще не следует использовать в управляемом коде, поскольку среда CLR имеет относительно большой вес и может вызвать конфликты версий.

    Эта инъекция кода также будет выглядеть подозрительно для антивирусного программного обеспечения, которое может ее заблокировать.

  • Низкоуровневая ловушка клавиатуры с использованием WH_KEYBOARD_LL является лучшим выбором для управляемого кода, поскольку она обрабатывает события клавиатуры в вашем собственном приложении. Тем не менее, требуется, чтобы каждое событие клавиатуры обрабатывалось вашим потоком.

    Это увеличивает время между нажатием клавиши и ее получением целевым приложением.

    Это особенно плохо, если приложение с более высоким приоритетом ЦП, чем ваше приложение, лишает его процессорного времени. В этом случае задержка может достигать нескольких секунд, объединяя множество нажатий клавиш. Некоторые (плохо написанные) игры так работают и в такой ситуации становятся неиграбельными.

  • Функция Windows API RegisterHotKey является подходящей функцией для использования для глобальных горячие клавиши.

    Windows выполнит фильтрацию за вас и уведомит ваше приложение только в том случае, если была нажата одна из зарегистрированных клавиш, поэтому вам не нужно обрабатывать их все.

Использование простой F-клавиши в качестве глобальной горячей клавиши, как вы планируете, проблематично, так как она часто конфликтует с локальной горячей клавишей приложения, которое имеет фокус. Таким образом, вы должны сделать глобальные горячие клавиши настраиваемыми, чтобы пользователь мог избежать конфликтов с их часто используемыми приложениями.

person CodesInChaos    schedule 21.02.2011