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

в 10:33, , рубрики: .net, WinAPI, горячие клавиши, метки: , ,

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

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

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)

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

Автор: Ogoun

Поделиться

* - обязательные к заполнению поля