Как стать автором
Обновить

Библиотека для регистрации и отлова нажатий 'горячих' комбинация клавиш

Время на прочтение 3 мин
Количество просмотров 6.2K
Под комбинацией клавиш понимается любое количество одновременно нажатых клавиш, нажатых в любом порядке, которое может позволить ваша клавиатура. Для конечного пользователя, однако, не стоит превышать количество более пяти в одной комбинации, т.к. игровые клавиатуры есть не у всех.

Пример использования

HotKeysManager manager = new HotKeysManager();
manager.AddHotKey(new HotKeyCombination(() => { MessageBox.Show("Привет, Хабр!"); }) { Keys.LControlKey, Keys.H });

Другой вариант добавления, где в качестве комбинации берутся текущие нажатые клавиши, удобно в случае когда пользователь назначает комбинацию сам. В демке есть пример подобной записи комбинаций.
manager.AddHotKey(new HotKeyCombination(HookManager.CurrentDownedKeys.ToArray(), () => { MessageBox.Show("Привет, Хабр!"); }));


Теперь при нажатии комбинации LeftCtrl+H (или H+LeftControl), мы увидим приветственное сообщение.

Как сделано


Используются три WinAPI функции для глобального перехвата нажатий:
/// <summary>
/// Функция передающая перехватываемое сообщение следующему обработчику
/// </summary>
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);
/// <summary>
/// Функция устанавливает перехват системных сигналов
/// </summary>
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, int dwThreadId);
/// <summary>
/// Отключение перехвата системных сигналов
/// </summary>
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
private static extern int UnhookWindowsHookEx(int idHook);


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

Перехват нажатий автоматически включается/отключается в зависимости от наличия комбинаций.

Функционал

Класс HotKeysManager

Методы:
  • EnableHotKeys/DisableHotKeys — ручное включение отключение проверки комбинаций клавиш
  • AddHotKey(string, HotKeyCombination) — добавление комбинации клавиш в коллекцию, с указанием ключа
  • AddHotKey(HotKeyCombination) — добавление комбинации клавиш с автоматическим формированием ключа (ключ будет сформирован в виде Key1+Key2+...+Keyn)
  • RemoveHotKey(string) — удаление комбинации с указанием ключа в коллекции
  • RemoveHotKey(HotKeyCombination) — удаление комбинации, ключ будет сформирован автоматически (Key1+Key2+...+Keyn), при отсутствии комбинации с таким ключом, исключение выброшено не будет


События:
  • NewCombination — оповещает о появлении новой комбинации, использвется делегат вида (string){}, где в качестве параметра передается строка Key1+Key2+...+Keyn


Класс HookManager (статический класс)


Свойства:
  • CurrentDownedKeys — список нажатых клавиш (List<Keys>)
  • CurrentDownedKeysDescription — строка с описанием нажатых клавиш (Key1+Key2+...+Keyn)


События:
  • ChangeKeyState — оповещает об изменении набора нажатых клавиш, делегат без параметров


Скачать (source + bin_x86)

При использовании стоит помнить что перехат идет глобальный, и если требуется совержать действие только при активном окне вашей программы, требуется ввести дополнительную проверку.
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
+21
Комментарии 7
Комментарии Комментарии 7

Публикации

Истории

Работа

.NET разработчик
66 вакансий

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн