слушать ключ, когда приложение не сфокусировано - PullRequest
10 голосов
/ 21 февраля 2011

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

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

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

1 Ответ

18 голосов
/ 21 февраля 2011

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

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

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

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

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

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

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

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

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

...