Под комбинацией клавиш понимается любое количество одновременно нажатых клавиш, нажатых в любом порядке, которое может позволить ваша клавиатура. Для конечного пользователя, однако, не стоит превышать количество более пяти в одной комбинации, т.к. игровые клавиатуры есть не у всех.
Пример использования
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 — оповещает об изменении набора нажатых клавиш, делегат без параметров
При использовании стоит помнить что перехат идет глобальный, и если требуется совержать действие только при активном окне вашей программы, требуется ввести дополнительную проверку.
Автор: Ogoun