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

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

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

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

Методы:


События:


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


Свойства:


События:


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

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